【问题标题】:How do I DROP a constraint from a sqlite (3.6.21) table?如何从 sqlite (3.6.21) 表中删除约束?
【发布时间】:2010-12-25 11:33:42
【问题描述】:

我有下表:

CREATE TABLE child( 
  id INTEGER PRIMARY KEY, 
  parent_id INTEGER CONSTRAINT parent_id REFERENCES parent(id), 
  description TEXT);

如何取消约束?

【问题讨论】:

标签: sqlite constraints ddl


【解决方案1】:

SQLite 不(截至此答案)支持 alter table drop constraint 命令。可以看到允许的语法here。您需要创建一个没有约束的新表,传输数据,然后删除旧表。

我认为类似以下的方法应该有效:

CREATE TABLE child2 ( 
    id          INTEGER PRIMARY KEY, 
    parent_id   INTEGER,
    description TEXT
);
INSERT INTO child2 (id, parent_id, description)
   SELECT id, parent_id, description FROM CHILD;
DROP TABLE child;
ALTER TABLE child2 RENAME TO child;

请注意,insert into 可能会被简化为使用明确的列名,但我保留了它,以防您也想更改结构。

例如,如果您要删除 parent_id 列上的约束,那么将其保留在那里是很可疑的。在这种情况下,您可以将数据传输修改为:

CREATE TABLE child2 (id INTEGER PRIMARY KEY, description TEXT);
INSERT INTO child2 (id, description) SELECT id, description FROM CHILD;

【讨论】:

  • 您也可以将上面的步骤1和2合并到一个sql语句中我认为:“create table child2 as select * from child;”尽管您必须手动添加 PK 约束。
  • @chacmool 创建表后,您无法手动添加 PK 约束。 SQLite Docs
  • 第二条语句可以缩短为INSERT INTO child2 SELECT * FROM CHILD;
  • @Dariush,是的,你可以。但是,如果它不受约束,则传输父 id 几乎没有意义。我意识到我在最后一段中并没有完全清楚地说明这一点,所以我会试着澄清一下。
  • @Found,您很可能只是修改外键引用来引用新表。我不知道在重命名之前这是否可行,但它应该(作为最后的手段)可以删除约束,重命名表然后重新添加约束。这可能应该在没有其他用户同时访问数据库的情况下完成,因为在没有约束的情况下,他们可能会将数据库置于无效状态(相对于所述约束)。
【解决方案2】:

我认为这是一种更简单、更简洁的方法:

copy db.sqlite3 backup-db.sqlite3
echo .dump tablename | sqlite3 db.sqlite3 > modify.sql
(now delete or change the constraint in modify.sql)
echo drop table tablename; | sqlite3 db.sqlite3 
sqlite3 db.sqlite3 < modify.sql

您现在可以重新转储新的数据库表并比较差异。

【讨论】:

  • Linux/sh下,可能需要使用echo drop table tablename\;。注意分号前的反斜杠。
  • 还请考虑使用 paxdiablo 的方法,您可以将整个操作放在一个事务中,如果任何步骤失败,该事务将回滚,使您的数据库保持原始状态。使用您的方法,您需要检查步骤 2、4 和 5 的错误并相应地中止,这会使代码不那么简洁。
  • SQLiteStudio 允许您将整个数据库导出为 SQL。这使您可以像 jftuga 使用命令行工具一样进行操作。
  • 伙计,这就像叫出租车去邻居家一样!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2012-12-16
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多