SQLite:为什么外键约束在这里不起作用?

SQLite:为什么外键约束在这里不起作用?,sql,sqlite,Sql,Sqlite,基于此,我原以为在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) REFE

基于此,我原以为在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);
启用外键支持 为了在SQLite中使用外键约束,库必须 编译时既不使用SQLITE\u OMIT\u外键,也不使用SQLITE\u OMIT\u触发器 定义如果定义了SQLITE_OMIT_触发器,但定义了SQLITE_OMIT_外键 如果不是,则SQLite的行为与版本3.6.19之前的行为相同 2009年10月14日-外键定义被解析并可被查询 使用PRAGMA外键列表,但不使用外键约束 强制执行。在这种情况下,PRAGMA foreign_keys命令是不可操作的 配置如果定义了“忽略外键”,则外键 在尝试指定外键时,甚至无法分析定义 定义是一个语法错误

PRAGMA外键;PRAGMA外键=布尔值

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

该pragma是事务中的no op;外键约束 只有在没有挂起的情况下才能启用或禁用强制 开始或保存点

更改“外键”设置会影响所有命令的执行 使用数据库连接准备的语句,包括 更改设置之前已准备好。任何现有声明 使用旧式sqlite3_准备接口准备可能会失败,并出现错误 更改外键设置后发生SQLITE_架构错误

从SQLite版本3.6.19开始,外键的默认设置 执法工作已经停止。但是,在将来的版本中,这种情况可能会改变 SQLite。外键强制的默认设置可以是 在编译时使用SQLITE\u DEFAULT\u外键指定 预处理器宏。为了尽量减少将来的问题,应用程序应该 根据应用程序的要求设置外键强制标志 并且不依赖于默认设置

启用外键支持 为了在SQLite中使用外键约束,库必须 编译时既不使用SQLITE\u OMIT\u外键,也不使用SQLITE\u OMIT\u触发器 定义如果定义了SQLITE_OMIT_触发器,但定义了SQLITE_OMIT_外键 如果不是,则SQLite的行为与版本3.6.19之前的行为相同 2009年10月14日-外键定义被解析并可被查询 使用PRAGMA外键列表,但不使用外键约束 强制执行。在这种情况下,PRAGMA foreign_keys命令是不可操作的 配置如果定义了“忽略外键”,则外键 在尝试指定外键时,甚至无法分析定义 定义是一个语法错误

PRAGMA外键;PRAGMA外键=布尔值

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

该pragma是事务中的no op;外键约束 只有在没有挂起的情况下才能启用或禁用强制 开始或保存点

更改“外键”设置会影响所有命令的执行 使用数据库连接准备的语句,包括 更改设置之前已准备好。任何现有声明 使用旧式sqlite3_准备接口准备可能会失败,并出现错误 更改外键设置后发生SQLITE_架构错误

从SQLite版本3.6.19开始,外键的默认设置 执法工作已经停止。但是,在将来的版本中,这种情况可能会改变 SQLite。外键强制的默认设置可以是 在编译时使用SQLITE\u DEFAULT\u外键指定 预处理器宏。为了尽量减少将来的问题,应用程序应该 根据应用程序的要求设置外键强制标志 并且不依赖于默认设置

您需要首先启用:

您需要首先启用:


您可以强制使用外键,如下所示:

创建表格歌曲 songid整数, 歌曲艺术家文本, 歌曲集文本, songname文本, 外国歌曲艺术家,歌曲专辑参考专辑艺术家,专辑名称
;

您可以强制使用外键,如下所示:

创建表格歌曲 songid整数, 歌曲艺术家文本, 歌曲集文本, songname文本, 外国歌曲艺术家,歌曲专辑参考专辑艺术家,专辑名称
;

您可能需要运行PRAGMA foreign_keys=ON;在其他查询之前。您可能需要运行PRAGMA foreign_keys=ON;在你的其他查询之前。啊哈,不,我只是从下载。那么,从哪里可以获得支持外键的版本呢似乎默认版本支持外键,因此@laalto answer是正确的oneAha,不,我刚从下载。那么,从哪里可以获得支持外键的版本呢默认版本似乎支持外键,因此@laalto answer是正确的
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
PRAGMA foreign_keys=on;