2009-12-10 60 views

回答

73

SQLite不支持alter table drop constraint命令。您将需要创建一个没有约束的新表,传输数据,然后删除旧表。

我觉得像下面应该工作:

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; 

你也可以从上面的,如果你不希望它传输的所有语句离开了PARENT_ID。

+0

悲伤的脸。这是我的想法。我希望我误解了'ommitted'文档。 – 2009-12-10 23:41:18

+1

你也可以将上面的步骤1和步骤2组合成一个sql语句methinks:“create child2 as select * from child;”尽管你必须手动添加PK约束。 – chacmool 2014-02-24 03:30:18

+1

@chacmool在创建表之后,您无法手动添加PK约束。 [SQLite文档](https://www.sqlite.org/lang_createtable.html) – 2015-12-19 18:04:17

4

我觉得这是一个更简单,更简洁的方法:

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 

您现在可以redump新的数据库表和比较的差异。

+1

在Linux/sh下,您可能需要使用'echo drop table tablename \;'。注意分号前的反斜杠。 – jftuga 2014-01-30 18:55:06

+1

另外考虑到,使用paxdiablo的方法,您可以将整个操作放入一个事务中,如果任何步骤失败,这个事务将会回滚,让您的数据库保持其原始状态。用你的方法,你会想在步骤2,4和5检查错误并相应地中止,这使得代码不那么简洁。 – 2014-11-10 14:56:19

+0

SQLiteStudio允许您将整个数据库导出为SQL。这可以让你像jftuga一样使用命令行工具。 – 2014-11-10 17:41:22