如何在SQLite中获取外键约束的名称?

时间:2017-01-11 15:49:44

标签: sqlite

SQLite确实有一个限制,即无法检索外键的名称吗?我在问,因为我无法在文档中的任何地方找到这个限制。

例如,我运行以下脚本:

CREATE TABLE
       users (
       id INTEGER NOT NULL PRIMARY KEY,
       first_name TEXT NOT NULL,
       last_name TEXT NOT NULL
) ;

CREATE TABLE
       orders (
       id INTEGER NOT NULL PRIMARY KEY,       
       user_id INTEGER NOT NULL,       
       CONSTRAINT fk_users FOREIGN KEY (user_id) REFERENCES users(id)
) ;

现在我想查看关键字" fk_users"确实创建了,所以我运行以下PRAGMA:

PRAGMA foreign_key_list(orders);

我希望在第一列中看到我的外键的名称,但我看到一些" 0"价值而不是。此外,如果我使用自定义名称创建多个外键,它们都被称为" 0"或" 1"。

这确实是SQLite的限制,还是我错过了什么?

2 个答案:

答案 0 :(得分:1)

没有提取约束名称的机制。

答案 1 :(得分:1)

表sqlite_master在“sql”列中存储CREATE命令。您可以查询该命令并进行一些解析以提取外键的名称。一个适用于我的组合外键的示例:

SELECT sql FROM sqlite_master WHERE name = 'song'

产量

CREATE TABLE "song" (
"songid"  INTEGER,
"songartist"  TEXT,
"songalbum"  TEXT,
"songname"  TEXT,
CONSTRAINT "fk__song_album" FOREIGN KEY ("songartist", "songalbum") REFERENCES "album" ("albumartist", "albumname")
)

并包含外键的名称“fk__song_album”。

如果用查询改变外键,则修改/更新sql列的内容:

  

sqlite_master.sql列中的文本是创建该对象的原始CREATE语句文本的副本,除了如上所述标准化并由后续ALTER TABLE语句修改之外。对于由UNIQUE或PRIMARY KEY约束自动创建的内部索引,sqlite_master.sql为NULL。

https://www.sqlite.org/fileformat2.html

额外提示: 要在Navicat(Lite)中查看外键信息,请右键单击表并选择“设计表”。然后选择外键选项卡。

enter image description here