我有一个问题与SQLITE3。
我使用以下SQL脚本创建了两个表persons
和orders
:
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
表。
它没有显示任何错误。
这怎么可能。
5条答案
按热度按时间yqyhoc1h1#
在SQLite 3.x中,您必须在每次连接到SQLite数据库时进行以下查询:
否则SQLite将忽略所有外键约束。
为什么每次都是这样?根据文档,向后兼容SQLite 2.x。
在SQLite 4.x中,FK约束将是enabled by default。
ncgqoxb02#
SQLite Foreign Key Support
这将启用外键约束。
ttvkxqim3#
检查你是否在SQLite中启用了外键约束:http://sqlite.org/foreignkeys.html#fk_enable
4sup72z84#
你读过文档了吗?main page说它是在3.6.19版本中引入的。link展示了如何使用外键(你的代码是正确的)。
你的代码是否给予了你忽略的错误信息?你是否检查了文档中指定的所有前提条件?
9lowa7mx5#
其他答案没有提到的一个重要注意事项是,启用/禁用外部约束的命令检查如下:
在已启动的事务中无效。下面是文档中的引用:
此杂注在事务中是空操作;外键约束强制只能在没有未决的开始或SAVEPOINT时启用或禁用。
该命令应该在事务启动之前运行。当我试图暂时禁用FK约束检查以解决性能问题时,我遇到了这个问题,但如果在不适当的时间使用该命令,这仍然可能导致问题。