SQLite3不支持外键约束吗?

57hvy0tb  于 2023-03-30  发布在  SQLite
关注(0)|答案(5)|浏览(126)

我有一个问题与SQLITE3。
我使用以下SQL脚本创建了两个表personsorders

sqlite> create table Persons(
            P_Id int primary key,
            LastName varchar,
            FirstName varchar,
            Address varchar,
            City varchar
        );

sqlite> create table Orders(
            O_Id int NOT NULL,
            OrderNo int NOT NULL,
            P_Id int, 
            PRIMARY KEY (O_Id),
            FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
        );

sqlite> insert into Orders values(1,77895,3);

sqlite> select * from Orders;

1|77895|3

sqlite>

即使persons表为空,也可以将行插入orders表。
它没有显示任何错误。
这怎么可能。

yqyhoc1h

yqyhoc1h1#

在SQLite 3.x中,您必须在每次连接到SQLite数据库时进行以下查询:

PRAGMA foreign_keys = ON;

否则SQLite将忽略所有外键约束。
为什么每次都是这样?根据文档,向后兼容SQLite 2.x。
在SQLite 4.x中,FK约束将是enabled by default

ncgqoxb0

ncgqoxb02#

SQLite Foreign Key Support

sqlite> PRAGMA foreign_keys = ON;

这将启用外键约束。

ttvkxqim

ttvkxqim3#

检查你是否在SQLite中启用了外键约束:http://sqlite.org/foreignkeys.html#fk_enable

4sup72z8

4sup72z84#

你读过文档了吗?main page说它是在3.6.19版本中引入的。link展示了如何使用外键(你的代码是正确的)。
你的代码是否给予了你忽略的错误信息?你是否检查了文档中指定的所有前提条件?

9lowa7mx

9lowa7mx5#

其他答案没有提到的一个重要注意事项是,启用/禁用外部约束的命令检查如下:

PRAGMA foreign_keys = ON;

在已启动的事务中无效。下面是文档中的引用:
此杂注在事务中是空操作;外键约束强制只能在没有未决的开始或SAVEPOINT时启用或禁用。
该命令应该在事务启动之前运行。当我试图暂时禁用FK约束检查以解决性能问题时,我遇到了这个问题,但如果在不适当的时间使用该命令,这仍然可能导致问题。

相关问题