2010-02-05 2 views
1

최근 sqlite 버전에서 테이블을 수정하여 미리 정의 된 스키마와 일치시키는 간단한 방법이 있습니까?SQLite3 및 Alter table .. 이후

스키마는 다른 설정과 일치하므로

war_id INTEGER NOT NULL, 
clanname VARCHAR(64), 
clanhomepage VARCHAR(128), 
date DATETIME, 
server VARCHAR(64), 
warmode_id INTEGER, 
squad_id INTEGER, 
notes TEXT, clantag String(16), 
PRIMARY KEY (war_id), 
FOREIGN KEY(warmode_id) REFERENCES warmodes (warmode_id), 
FOREIGN KEY(squad_id) REFERENCES squads (squad_id), 
FOREIGN KEY(orgamember_id) REFERENCES users (user_id) 

가 지금은 clanname 후 clantag VARCHAR (16) 를 삽입 할.

나는 다시, 수출 죽겠다 상관 없어, 아직 나는 그것을 처리 할 수없이 그렇게 할 수있는 옵션이 주어진 다른 SQL 데이터베이스가 있는지 궁금 ...

+0

하여 붙여 스키마에 오류가 아마 있습니다 : 그것은 이미 clantag라는 열이 있습니다. 우연이라고 생각해? – Ondergetekende

+0

SQLite 문서를 읽는 데 시간을 할애하는 것이 좋습니다. 그것은 다른 SQL 데이터베이스와 상당히 다릅니다. 스키마에서는 SQLite의 독특한 타이핑 시스템에 익숙하지 않다고 제안합니다. – Ondergetekende

+0

예기치 않은 사고였습니다 ... 변경된 것 대신에 손길이 닿지 않은 것을 게시하고 싶었습니다. 그리고 내 말이 맞습니다. 저는 코드가 대부분 데이터베이스에 무관심하며 따라서 하나의 많은 특정 항목을 사용할 수 없기 때문에 sqlite 자체의 많은 내부적 인 작업을 사용하지 않습니다. – Jokey

답변

3

SQLite는이 shown here로, 열을 추가 지원합니다. 당신이 직면하게 될 유일한 제한은 컬럼이 테이블의 끝에있을 것이라는 것입니다. 그러나 정상적으로 사용하려면 컬럼 순서가 문제가되지 않아야합니다. 또 다른 해결책은, 그것으로 모든 데이터를 삽입 된 테이블을 삭제하고 다음과 같이 새 테이블의 이름을 바꿀 새로운 정의와 함께 새 테이블을 만드는 것입니다 :

BEGIN TRANSACTION; 
CREATE TABLE War_TMP( 
    war_id INTEGER NOT NULL, 
    clanname VARCHAR(64), 
    clantag VARCHAR(16), 
    clanhomepage VARCHAR(128), 
    date DATETIME, 
    server VARCHAR(64), 
    warmode_id INTEGER, 
    squad_id INTEGER, 
    notes TEXT, 
    PRIMARY KEY (war_id), 
    FOREIGN KEY(warmode_id) REFERENCES warmodes (warmode_id), 
    FOREIGN KEY(squad_id) REFERENCES squads (squad_id), 
    FOREIGN KEY(orgamember_id) REFERENCES users (user_id) 
); 

INSERT INTO War_TMP() SELECT war_id, clanname, "", clanhomepage,date,server,warmode_id,squad_id,notes FROM War; 
DROP TABLE War; 

ALTER TABLE War_TMP RENAME TO War; 

COMMIT; 
+0

그게 내가 끝까지 기대했던거야 :) 알았어. 나는 이것보다 더 간단한 것을 간과하지 않았다. – Jokey