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

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_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
;
Run Code Online (Sandbox Code Playgroud)

请注意,某些字段pragma_foreign_key_listlike table, from, ...必须被引用;


Ben*_*oit 15

使用SQLite shell,使用该.schema指令,并使用GREP过滤包含的行REFERENCES.

shell.cSQLite存储库,今天的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)

第二个可能是你正在寻找的.

  • 我想我应该写一下,列出表的外键的正确命令是`PRAGMA foreign_key_list`,而不是'PRAGMA foreign_keys`. (3认同)