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

Vig*_*ran 3 database sqlite constraints foreign-keys primary-key

我已经设定 PRAGMA foreign_keys=ON;

我正在尝试删除sqlite3表中的一些记录并显示 Error: constraint failed

sqlite> delete from auth_user where id = 110;
Error: constraint failed
Run Code Online (Sandbox Code Playgroud)

它是有效的,如果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
);
Run Code Online (Sandbox Code Playgroud)

小智 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));
Run Code Online (Sandbox Code Playgroud)

您可以列出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))
Run Code Online (Sandbox Code Playgroud)

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