如何在sqlite表中查找特定主键的所有引用?

时间:2012-08-28 06:07:15

标签: database sqlite foreign-keys primary-key constraints

我已设置PRAGMA foreign_keys=ON;

我正在尝试删除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
);

1 个答案:

答案 0 :(得分:5)

我认为没有一种明确的方法来列出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))

您可能已经知道这一点,但删除了在关闭外键时限制某些外键的行有点打破了数据库的引用完整性,因此我只能建议您不要这样做。