如何从sqlite(3.6.21)表中删除约束?
我有以下表格:如何从sqlite(3.6.21)表中删除约束?
CREATE TABLE child(
id INTEGER PRIMARY KEY,
parent_id INTEGER CONSTRAINT parent_id REFERENCES parent(id),
description TEXT);
如何删除约束?
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。
悲伤的脸。这是我的想法。我希望我误解了'ommitted'文档。 – 2009-12-10 23:41:18
你也可以将上面的步骤1和步骤2组合成一个sql语句methinks:“create child2 as select * from child;”尽管你必须手动添加PK约束。 – chacmool 2014-02-24 03:30:18
@chacmool在创建表之后,您无法手动添加PK约束。 [SQLite文档](https://www.sqlite.org/lang_createtable.html) – 2015-12-19 18:04:17
我觉得这是一个更简单,更简洁的方法:
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新的数据库表和比较的差异。
在Linux/sh下,您可能需要使用'echo drop table tablename \;'。注意分号前的反斜杠。 – jftuga 2014-01-30 18:55:06
另外考虑到,使用paxdiablo的方法,您可以将整个操作放入一个事务中,如果任何步骤失败,这个事务将会回滚,让您的数据库保持其原始状态。用你的方法,你会想在步骤2,4和5检查错误并相应地中止,这使得代码不那么简洁。 – 2014-11-10 14:56:19
SQLiteStudio允许您将整个数据库导出为SQL。这可以让你像jftuga一样使用命令行工具。 – 2014-11-10 17:41:22
http://sqlite.org/lang_dropindex.html – 2014-01-01 08:58:35