使用Java执行SQLite删除语句报外键约束失败但直连库执行正常问题咨询
SQLite执行SQL脚本报外键约束失败的常见原因
- 外键约束检查配置不一致:SQLite默认关闭外键约束检查,你直连数据库使用的客户端大概率沿用了默认配置,因此脚本执行不会触发外键校验;而Java使用的SQLite驱动(比如
sqlite-jdbc)部分版本默认开启外键约束检查,或是你在连接配置中手动开启了PRAGMA foreign_keys = ON,此时执行删除就会触发外键校验规则。 - 语句执行顺序错误:你的脚本逻辑是先删除关联表
Edges的关联数据,再删除主表StationRefs的数据,符合外键约束要求。如果Java逐行读取文件时出现行顺序错乱(比如文件换行符解析异常、读取逻辑错误导致先读取到了StationRefs的删除语句),会先执行主表删除,此时Edges还存在关联数据,就会触发外键约束报错。 - 部分删除语句未正常执行:如果Java逐行执行时,某条
Edges的DELETE语句因为语法解析错误、参数转义问题(比如你示例中的"是HTML转义字符,Java读取时如果没有转义回双引号,会导致SQL执行失败)没有执行成功,Edges中会残留关联StationRefs的数据,后续执行主表删除时就会触发约束报错。 - 多连接执行导致数据不可见:如果你使用不同的数据库连接分别执行这些SQL语句,且未关闭事务自动提交的情况下,先执行的
Edges删除操作在其他连接中不可见,执行StationRefs删除的连接会认为关联数据仍然存在,触发约束报错。 - 语句拆分错误:如果你的实际SQL文件中存在单条SQL跨行的情况,仅按换行符拆分语句会导致SQL被截断,部分删除逻辑未执行,最终触发外键约束报错。
内容的提问来源于stack exchange,提问作者mario
相关产品推荐
相关产品推荐

