【问题标题】:How to get the names of foreign key constraints in SQLite?如何在 SQLite 中获取外键约束的名称?
【发布时间】:2017-02-21 18:45:30
【问题描述】:

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 的限制,还是我遗漏了什么?

【问题讨论】:

    标签: sqlite


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      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) 中查看外键信息...右键单击一个表并选择“设计表”。然后选择外键选项卡。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-17
        • 2013-05-03
        • 2013-06-29
        • 1970-01-01
        • 2011-05-14
        • 2017-11-06
        • 2012-02-03
        相关资源
        最近更新 更多