我有以下表格:如何從sqlite(3.6.21)表中刪除約束?
CREATE TABLE child(
id INTEGER PRIMARY KEY,
parent_id INTEGER CONSTRAINT parent_id REFERENCES parent(id),
description TEXT);
如何刪除約束?
我有以下表格:如何從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