2012-08-28 23 views
2

我已經設置PRAGMA foreign_keys=ON;如何查找sql​​ite表中特定主鍵的所有引用?

我想在sqlite3的表中刪除一些記錄並顯示Error: constraint failed

sqlite> delete from auth_user where id = 110; 
Error: constraint failed 

它的工作原理,如果PRAGMA foreign_keys是關閉的。數據庫有這麼多表,錯誤是如此模糊。我認爲如果我們嘗試刪除,其他數據庫系統將列出引用主鍵的表。

什麼是有效的方式,我可以找到所有引用特定主鍵id = 110的表?

模式:

CREATE TABLE "auth_user" (
    "id" integer NOT NULL PRIMARY KEY, 
    "username" varchar(30) NOT NULL UNIQUE, 
    "first_name" varchar(30) NOT NULL, 
    "last_name" varchar(30) NOT NULL, 
    "email" varchar(75) NOT NULL, 
    "password" varchar(128) NOT NULL, 
    "is_staff" bool NOT NULL, 
    "is_active" bool NOT NULL, 
    "is_superuser" bool NOT NULL, 
    "last_login" datetime NOT NULL, 
    "date_joined" datetime NOT NULL 
); 

回答

4

我不認爲這是一個明確的方式列出與SQLite的外鍵約束。但是,您可以列出所有具有如下所示限制的表格。然後,您可以解析返回的SQL以查找約束。

假設你有一個兩父子表:

sqlite> PRAGMA foreign_keys=ON; 
sqlite> create table Parent (
    ...>  Id INTEGER PRIMARY KEY AUTOINCREMENT, 
    ...>  foo TEXT); 
sqlite> create table Child (
    ...>  Id INTEGER PRIMARY KEY AUTOINCREMENT, 
    ...>  ParentId INTEGER NOT NULL, 
    ...>  bar TEXT, 
    ...>  FOREIGN KEY (ParentId) REFERENCES Parent(Id)); 

可以列出CREATE TABLE語句有外鍵:

sqlite> SELECT sql FROM sqlite_master WHERE sql LIKE '%REFERENCES%'; 
CREATE TABLE Child (
    Id INTEGER PRIMARY KEY AUTOINCREMENT, 
    ParentId INTEGER NOT NULL, 
    bar TEXT, 
    FOREIGN KEY (ParentId) REFERENCES Parent(Id)) 

你可能已經知道這一點,但刪除行是在外鍵被關閉的情況下限制了某些外鍵有時違反了數據庫的參照完整性,所以我只能建議你不要這樣做。

+0

哦..我不知道sqlite_master。我使用bash腳本來解析模式。不管怎麼說,還是要謝謝你。 – Vigneshwaran

相關問題