SQLite:为什么外键约束在这里不起作用?
基于此,我原以为在SQLite中执行时,会在SQL的最后一行出现外键约束错误,但它只是将其全部吞没并继续执行。为什么呢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
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;