2010-02-05 42 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