【问题标题】:SQLite3 and Alter table .. afterSQLite3 和 Alter 表 .. 之后
【发布时间】:2010-02-05 19:17:57
【问题描述】:

有没有一种简单的方法来修改最近的 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 数据库可以处理...

【问题讨论】:

  • 您粘贴的架构中可能存在错误:它已经包含名为 clantag 的列。我想那是偶然的?
  • 我建议你花一些时间阅读 SQLite 文档。它与其他 SQL 数据库有很大不同。您的架构表明您不熟悉 SQLite 的特殊类型系统。
  • 是的,那是偶然的...想发布未修改的而不是修改过的。你是对的,我没有使用太多 sqlite 本身的内部工作,因为我的代码大多与数据库无关,因此不能使用单个代码的许多特定内容。

标签: sql sqlite alter-table


【解决方案1】:

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;

【讨论】:

  • 这就是我期望的结果 :) 很高兴知道,我没有忽略比这更简单的事情。
猜你喜欢
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 2014-11-04
  • 1970-01-01
相关资源
最近更新 更多