有没有一种方法可以列出SQLite数据库中所有外键?它们似乎没有存储在sqlite_master中,而
PRAGMA foreign_key_list('table')
一次只能列出一个外键。或者,有没有一种方法可以列出参考某个表的所有外键?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") */
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
;
ON m.name != p."table"
,因为SQLite允许(INNER)JOIN不带ON子句?(将其视为ON 1=1,就像CROSS JOIN一样。) - urbanSoftON
不能省略。而且作为个人偏好,我更喜欢打更多的字符并明确发生了什么。 - Francisco Puga使用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
第二个可能是你正在寻找的东西。sqlite_master
获取表名,然后为每个表调用PRAGMA foreign_keys
)是最简单的方法。不幸的是,PRAGMA结果无法与SELECT语句合并... - MartijnPRAGMA foreign_key_list
,而不是 PRAGMA foreign_keys
。 - MPelletier
sqlite3 test.sqlite .dump | less -j.99
然后搜索“REFERENCES destTable”。 - undefined