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

3

我已经设置了PRAGMA foreign_keys=ON;

我正在尝试删除sqlite3表中的一些记录,但是它显示错误:约束失败

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个回答

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))

你可能已经知道了,但是在关闭外键约束的情况下删除受到外键约束的行会破坏数据库的引用完整性,因此我只能建议你不要这样做。


哦,我不知道sqlite_master。我使用bash脚本解析模式。无论如何,谢谢。 - Vigneshwaran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接