2015-02-02 3 views
1

SQLite 컨텍스트 내.SQLite : 데이터를 유지하면서 기존 테이블에 기본 키가있는 열 추가

나는 현재 수많은 행의 데이터로 채워진 기존 테이블을 가지고 있습니다.

원본 데이터를 유지하면서이 테이블에 새 기본 키 열을 추가하려고합니다. 아래에서 보듯

, 나는 다음과 같은

  1. 은 기존 테이블 (ID INTEGER)에 새 열을 추가 노력했다.
  2. 기존 테이블의 이름을 변경하십시오.
  3. 새 기본 키 (Id INTEGER PRIMARY KEY)가 포함 된 새 테이블을 만듭니다.
  4. 새로 이름이 바뀐 테이블의 모든 데이터를 새로 만든 테이블에 삽입하십시오.
  5. 이름이 바뀐 테이블을 삭제하십시오. SQLite는 설명서에 따라,

    열 선언 된 INTEGER PRIMARY KEY가 자동 증가 때문에

나는이 일 것이라고 생각하는 이유입니다.

그러나 다음과 같은 오류가 발생합니다.

ErrorCode : 19 
Message : constraint failed 
UNIQUE constraint failed: Person.Id 
Result : Constraint 

여기 내 코드입니다.

--Add a new column to the existing table(Id INT). 
ALTER TABLE [Person] 
ADD Id INTEGER; 

--Change the name of the existing table. 
ALTER TABLE [Person] RENAME TO Person_temp; 

--Create a new table which includes the new PK. 
CREATE TABLE Person(
    Id INTEGER PRIMARY KEY, 
    FirstName nvarchar(100) NULL, 
    LastName nvarchar(100) NULL 
); 

--Insert all data from the renamed table into the new table. 
INSERT INTO Person SELECT * FROM Person_temp; 

--Drop the renamed table. 
DROP TABLE Person_temp; 

빛을 비추는 사람은 누구나 친절 할 수 있습니까?

답변

1

삽입 쿼리에서 열 이름을 선언하지 않으므로 열 순서는 작성/추가 된 순서에 따라 달라집니다. 열 이름을 지정하십시오. 이것은, 당신은 아마 첫 번째 테이블에 Id 열을 추가 할 필요가 없습니다 보통 그런데 어쨌든

--Insert all data from the renamed table into the new table. 
INSERT INTO Person(Id, FirstName, LastName) SELECT Id, FirstName, LastName FROM Person_temp; 

하는 것이 좋습니다 :

--Insert all data from the renamed table into the new table. 
INSERT INTO Person(FirstName, LastName) SELECT FirstName, LastName FROM Person_temp; 

Id에 대한 암시는 null 값 대체 될 것이다 자동 증가에 의해

+0

내가 찾고있는 것.첫 번째 테이블에 Id 열이 필요 없다고 말하는 것도 옳았습니다. 건배 –

1

Id 열에 각 행에 고유 한 값이없는 것 같습니다. 방금 열을 추가 했으므로 각 행의 값은 동일합니다.

자동 증가는 새 행을 삽입 할 때 도움이됩니다. (max (id)를 선택하지 않고 id = max + 1 인 새 행 삽입). 기존 데이터 표를 자동으로 채우지는 않습니다.

SQLite에는 이미 원하는대로 작동 할 수있는 열이 있습니다. ROWID라고합니다. ID 열을 사용하여 복제하는 대신 사용하십시오.

+0

이것이 도움이되었지만 bwt의 대답은 더 완벽했습니다. 내 평판이 15에 오면 나는이 답을 유용하다고 표시 할 것이다. 의견을 보내 주셔서 감사합니다. –

+0

확실한 것 브랜든. 다행히 해결책을 찾았습니다. –

관련 문제