2009-12-10 29 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