较新版本的 SQLite支持外键约束。可以定义
CREATE TABLE MASTER (_ID INTEGER PRIMARY KEY, ...);
CREATE TABLE SERVANT (_ID INTEGER PRIMARY KEY, MASTERID INTEGER,
FOREIGN KEY(MASTERID) REFERENCES MASTER(_ID);
根据文档,默认情况下“NO ACTION”用于 ON DELETE 和 ON UPDATE。但与其他 DBS 不同,“NO ACTION”似乎并不意味着不执行删除或更新。至少根据我的测试(*)并且如果我正确理解文档,这似乎意味着没有采取任何措施来保持完整性:
配置“NO ACTION”意味着:当父键被修改或从数据库中删除时,不采取任何特殊操作。
因此
INSERT INTO MASTER (_ID) VALUES (1);
INSERT INTO SERVANT (_ID, MASTERID) VALUES (1,1);
DELETE FROM MASTER;
给了我一个空的 MASTER 表和一个 SERVANT 表,外键指向无处。
任何人都可以确认这种行为并解释为什么它是这样实现的吗?还是我必须配置一些东西才能使外键支持工作?我是 SQLite 开发的新手,所以如果这是一个愚蠢的问题,请原谅我。
编辑:(*)我的测试有缺陷,请参阅下面的答案。