SQLite列出数据库中的所有外键

时间:2011-03-31 11:21:54

标签: database-design sqlite

有没有办法在SQLite数据库中列出所有外键?

它们似乎不存储在sqlite_master中,而PRAGMA foreign_key_list('table')一次只列出一个。

或者,有没有办法列出哪些外键引用表?

3 个答案:

答案 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_masterpragma_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_listtable,... 的某些字段,必须