2010-02-05 73 views
1

是否有一種簡單的方法來修改最近sqlite版本中的表,以便它匹配預定義的模式?SQLite3和Alter表..

模式:

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