Fer*_*ran 11 sqlite database-design
有没有办法在SQLite数据库中列出所有外键?
它们似乎不存储在sqlite_master中,并且一次PRAGMA foreign_key_list('table')
只列出一个.
或者,有没有办法列出哪些外键引用表?
Fra*_*uga 18
似乎PRAGMA
可以通过一个小技巧以编程方式选择所有(或许多)命令;
通常被称为:
PRAGMA table_info('my_table');
PRAGMA foreign_key_list('my_table');
Run Code Online (Sandbox Code Playgroud)
但这也可以做到:
SELECT * FROM pragma_table_info('my_table');
SELECT * FROM pragma_foreign_key_list('my_table');
Run Code Online (Sandbox Code Playgroud)
和架构也可以得到(或多或少):
.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") */
Run Code Online (Sandbox Code Playgroud)
因此,要让所有 fks 之间进行 JOINsqlite_master
并pragma_foreign_key_list
可以做到这一点:
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
;
Run Code Online (Sandbox Code Playgroud)
请注意,某些字段pragma_foreign_key_list
like table
, from
, ...必须被引用;
Ben*_*oit 15
使用SQLite shell,使用该.schema
指令,并使用GREP过滤包含的行REFERENCES
.
从shell.c
SQLite存储库,今天的trunk中的版本,两个查询:
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
Run Code Online (Sandbox Code Playgroud)
和
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
Run Code Online (Sandbox Code Playgroud)
第二个可能是你正在寻找的.