有没有办法在SQLite数据库中列出所有外键?
它们似乎不存储在sqlite_master中,而PRAGMA foreign_key_list('table')
一次只列出一个。
或者,有没有办法列出哪些外键引用表?
答案 0 :(得分:15)
使用SQLite shell,使用.schema
指令,并使用GREP过滤包含REFERENCES
的行。
从SQLite存储库中的shell.c
,今天的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
和
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
第二个可能就是你要找的东西。
答案 1 :(得分:0)
这是一个hack,但这对我们有用:
*.db
)中搜索以下内容:FOREIGN KEY
NotePad ++ => 搜索 => 查找文件 => 查找内容 = FOREIGN KEY
您可以
答案 2 :(得分:0)
似乎可以通过一些技巧以编程方式选择所有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
之间的联接都可以做到这一点:
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
,... 的某些字段,必须;