sqlite-jdbc 3.36.0.3中ON DELETE CASCADE未生效问题咨询
SQLite ON DELETE CASCADE 不生效排查(针对sqlite-jdbc 3.36.0.3)
首先明确:sqlite-jdbc 3.36.0.3 不存在ON DELETE CASCADE相关的已知bug,社区也没有大规模反馈该版本级联删除失效的问题,你的问题根源是SQL语句的字段名错误。
问题具体原因
你创建Pet表时定义的外键字段是PersonId(无下划线),但插入Pet数据的SQL里写的是Person_id(带下划线):
INSERT INTO Pet(Id, Name, Person_id) VALUES (1, "Scruffy", 1), (2, "Poochy", 1);
SQLite默认处于宽松模式,遇到不存在的列名时不会报错,而是忽略该列的赋值操作。这导致Pet表的PersonId字段(NOT NULL约束)被默认赋值为0,而非你预期的1。此时Pet表的记录和Person表中Id=1的记录没有建立外键关联,自然不会触发ON DELETE CASCADE。
修正方案
将插入语句中的Person_id改为PersonId,修正后的SQL如下:
INSERT INTO Person(Id, Name) VALUES (1, "Jon"); INSERT INTO Pet(Id, Name, PersonId) VALUES (1, "Scruffy", 1), (2, "Poochy", 1); DELETE FROM Person WHERE Id=1;
执行修正后的语句后,删除Person表中Id=1的记录时,Pet表中关联的"Scruffy"和"Poochy"会被级联删除。
额外建议
可以开启SQLite的严格模式,避免这类字段名错误被忽略:
PRAGMA strict = ON;
开启后,插入不存在的列名会直接报错,能更早发现问题。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

