【问题标题】:SQLite: Why is foreign key constraint not working here? [duplicate]SQLite:为什么外键约束在这里不起作用? [复制]
【发布时间】:2016-11-29 10:15:43
【问题描述】:

基于https://www.sqlite.org/foreignkeys.html,我认为在 SQLite 中执行此 SQL 的最后一行时会出现外键约束错误,但它只是将其全部吞下并继续前进。这是为什么呢?

CREATE TABLE Person ( 
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(100)
);

CREATE TABLE Child (
    parent_id INTEGER,
    child_id INTEGER,

    FOREIGN KEY (parent_id) REFERENCES Person(id),
    FOREIGN KEY (child_id) REFERENCES Person(id)
);

INSERT INTO Person(name) 
       VALUES ('John Doe');
INSERT INTO Person(name) 
       VALUES ('Clara Doe');

INSERT INTO Child(parent_id, child_id) VALUES (45, 50);

【问题讨论】:

  • 您可能需要在其他查询之前运行PRAGMA foreign_keys = ON;

标签: sql sqlite


【解决方案1】:

您需要先启用foreign key enforcement:

PRAGMA foreign_keys=on;

【讨论】:

    【解决方案2】:

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

    1. 启用外键支持

    为了在 SQLite 中使用外键约束,库必须是 既不使用 SQLITE_OMIT_FOREIGN_KEY 也不使用 SQLITE_OMIT_TRIGGER 编译 定义。如果定义了 SQLITE_OMIT_TRIGGER 但 SQLITE_OMIT_FOREIGN_KEY 不是,那么 SQLite 的行为与版本 3.6.19 之前的行为相同 (2009-10-14) - 外键定义被解析并且可以被查询 使用 PRAGMA foreign_key_list,但没有外键约束 强制执行。 PRAGMA foreign_keys 命令在此是无操作的 配置。如果定义了 OMIT_FOREIGN_KEY,则外键 甚至无法解析定义(尝试指定外键 定义是语法错误)。


    https://www.sqlite.org/pragma.html#pragma_foreign_keys

    PRAGMA 外键; PRAGMA foreign_keys = boolean;

    查询、设置或清除外键约束的执行。

    此编译指示是事务中的空操作;外键约束 只有在没有待处理的情况下才能启用或禁用强制执行 开始或保存点。

    更改 foreign_keys 设置会影响所有的执行 使用数据库连接准备的语句,包括那些 在更改设置之前准备好。任何现有的陈述 使用旧的 sqlite3_prepare() 接口准备的可能会失败并显示 更改 foreign_keys 设置后的 SQLITE_SCHEMA 错误。

    从 SQLite 版本 3.6.19 开始,外键的默认设置 强制关闭。但是,这可能会在未来的版本中改变 SQLite。外键强制的默认设置可以是 在编译时使用 SQLITE_DEFAULT_FOREIGN_KEYS 指定 预处理器宏。为了尽量减少未来的问题,应用程序应该 根据应用程序的要求设置外键执行标志 并且不依赖于默认设置。


    sqlite> create table t1 (i int primary key);
    sqlite> create table t2 (j references t1(i));
    sqlite> insert into t2 values (1);
    sqlite> PRAGMA foreign_keys=on;
    sqlite> insert into t2 values (1);
    Error: FOREIGN KEY constraint failed
    

    【讨论】:

    • 啊哈,不,我刚从sqlite.org/download.html下载。那么我在哪里可以获得支持外键的版本呢? :(
    • 似乎默认版本支持外键,因此@laalto 答案是正确的
    【解决方案3】:

    您可以像下面这样强制执行外键:

    创建表歌曲( 歌曲整数, 歌手 TEXT, 歌曲专辑文本, 歌名文本, FOREIGN KEY(songartist, songalbum) REFERENCES album(albumartist, albumname) );

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 2021-02-13
      相关资源
      最近更新 更多