有没有办法列出 SQLite 数据库中的所有外键?
它们似乎没有存储在 sqlite_master 中,并且
PRAGMA foreign_key_list('table')
一次只列出一个。
或者,有没有办法列出哪些外键引用了表?
似乎所有(或许多)
PRAGMA
命令都可以通过一些小技巧来以编程方式选择;
通常被称为:
PRAGMA table_info('my_table');
PRAGMA foreign_key_list('my_table');
但这也可以做到:
SELECT * FROM pragma_table_info('my_table');
SELECT * FROM pragma_foreign_key_list('my_table');
并且也可以(或多或少)获得模式:
.schema pragma_table_info
/* pragma_table_info(cid,name,type,"notnull",dflt_value,pk) */;
.schema pragma_foreign_key_list
/* pragma_foreign_key_list(id,seq,"table","from","to",on_update,on_delete,"match") */
因此,要获得所有 fks,在
sqlite_master
和 pragma_foreign_key_list
之间加入 JOIN 就可以解决问题:
SELECT
m.name
, p.*
FROM
sqlite_master m
JOIN pragma_foreign_key_list(m.name) p ON m.name != p."table"
WHERE m.type = 'table'
ORDER BY m.name
;
请注意,
pragma_foreign_key_list
的某些字段,如table
、from
、... 必须被引用;
来自 dbeaver
的 sqlite 示例数据库的命令看起来像这样
在 SQLite shell 中,使用
.schema
指令,并使用 GREP 过滤包含 REFERENCES
的行。
来自 SQLite 存储库中的
shell.c
,主干中今天的版本,两个查询:
SELECT sql
FROM (
SELECT sql sql, type type, tbl_name tbl_name, name name
FROM sqlite_master
UNION ALL
SELECT sql, type, tbl_name, name
FROM sqlite_temp_master
)
WHERE tbl_name LIKE shellstatic()
AND type != 'meta'
AND sql NOTNULL
ORDER BY substr(type, 2, 1), name
和
SELECT sql
FROM (
SELECT sql sql, type type, tbl_name tbl_name, name name
FROM sqlite_master
UNION ALL
SELECT sql, type, tbl_name, name
FROM sqlite_temp_master
)
WHERE type != 'meta'
AND sql NOTNULL
AND name NOT LIKE 'sqlite_%'
ORDER BY substr(type, 2, 1), name
第二个可能就是您正在寻找的。