1

有没有一种简单的方法来修改最近的 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)

现在我想在 clanname 之后插入 clantag VARCHAR(16) 以便与其他设置保持一致。

我不介意导出、放弃、重新创建,但我想知道如果没有这些,是否可以选择这样做,因为其他 sql 数据库可以处理......

4

1 回答 1

3

SQlite 支持添加列,如此处所示。您将面临的唯一限制是该列将位于表的末尾,但对于正常使用,列顺序应该不是问题。另一种解决方案是使用新定义创建一个新表,将所有数据插入其中,删除旧表并重命名新表,如下所示:

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;
于 2010-02-05T19:35:13.373 回答