SQLite中ON DELETE SET NULL未按预期生效问题求助
我之前也碰到过一模一样的问题!当时折腾了好一会儿才找到原因,给你分享几个最可能的排查方向:
先确认外键约束有没有真的开启
SQLite默认是关闭外键支持的,这是最容易踩的坑!你需要先执行PRAGMA foreign_keys = ON;开启外键检查,而且这个设置是会话级的——每次重新连接数据库都要执行一次,或者在你的数据库连接配置里把它设为默认开启。如果没开的话,你设置的ON DELETE SET NULL根本不会生效,删除Session时自然会触发外键约束错误。检查Orders表的sessionID字段是否允许为NULL
你设置了ON DELETE SET NULL,前提是这个外键字段必须支持空值。如果建表时把Orders的sessionID设成了NOT NULL,那数据库没法把它设为NULL,直接就会报错。你可以执行PRAGMA table_info(Orders);查看这个字段的notnull属性,确认它的值是0(允许为空)。验证外键关联的字段类型是否完全匹配
外键关联的两个字段类型必须严格一致!你的Sessions表sessionId是INTEGER,那Orders表的sessionID也得是INTEGER——哪怕写成INT都不行,类型不匹配会导致外键约束逻辑异常,级联操作失效。排查事务相关的问题
如果是在事务中执行删除操作,可能之前的未提交操作导致了锁或者约束冲突。你可以试试先提交当前事务,或者直接在非事务环境下测试删除操作,看是不是事务的影响。
另外,你可以先手动把Orders表中对应Session的sessionID设为NULL,再尝试删除Session。如果这时候能成功,那就说明级联更新的逻辑没触发,重点排查前两个原因就好。
内容来源于stack exchange

