SQLite3和Alter表..之后

时间:2010-02-05 19:17:57

标签: sql sqlite alter-table

是否有一种简单的方法来修改最近的sqlite版本中的表,以便它与预定义的模式匹配?

架构:

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)

现在我要插入 clantag VARCHAR(16) 在clanname之后所以它与其他设置一致。

我不介意导出,丢弃,重新创建,但我想知道是否有一个选项可以在没有它的情况下这样做,因为其他sql数据库可以处理...

1 个答案:

答案 0 :(得分: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;