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

问题描述 投票:0回答:2

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

它们似乎没有存储在 sqlite_master 中,并且

PRAGMA foreign_key_list('table')
一次只列出一个。

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

sqlite
2个回答
28
投票

似乎所有(或许多)

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
、... 必须被引用;

第3方编辑

来自

的 sqlite 示例数据库的命令

看起来像这样


17
投票

在 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

第二个可能就是您正在寻找的。

© www.soinside.com 2019 - 2024. All rights reserved.