SQLite外键级联删除报错:外键不匹配问题排查
问题原因及解决方法
出现foreign key mismatch错误的核心原因是子表的外键约束未正确匹配父表的复合主键,具体问题如下:
- 错误的外键定义方式:父表
Astro_Target_Imaged使用包含5个字段的复合主键,但子表为每个字段单独定义外键约束,而非将这5个字段作为整体关联到父表的复合主键。SQLite要求外键必须匹配父表主键(或唯一约束)的完整列组合及顺序。 - 子表字段可空性不匹配:父表中
ATI_SITELAT是NOT NULL且属于主键,但子表中该字段未标记NOT NULL。关联主键的外键字段不能为NULL,因为主键字段本身不允许NULL值。
修正后的子表DDL
CREATE TABLE Astro_Target_Imaged_Date ( ATI_TargetName TEXT NOT NULL, ATI_Telescope TEXT NOT NULL, ATI_FocalLength TEXT NOT NULL, ATID_CCYYMMDD TEXT NOT NULL, ATI_SITELONG TEXT NOT NULL, ATI_SITELAT TEXT NOT NULL, -- 修正为NOT NULL TZ_UTC_Offset INTEGER (2), MI_Illumination_Percent TEXT, PRIMARY KEY ( ATI_TargetName, ATI_Telescope, ATI_FocalLength, ATID_CCYYMMDD, ATI_SITELONG, ATI_SITELAT ), -- 定义复合外键约束,匹配父表主键的列顺序 FOREIGN KEY ( ATI_TargetName, ATI_Telescope, ATI_FocalLength, ATI_SITELONG, ATI_SITELAT ) REFERENCES Astro_Target_Imaged ( ATI_TargetName, ATI_Telescope, ATI_FocalLength, ATI_SITELONG, ATI_SITELAT ) ON DELETE CASCADE );
关键修正点说明
- 复合外键约束:将原本分散的单个字段外键合并为一个包含所有5个关联字段的外键约束,确保与父表复合主键的列顺序完全一致。
- 字段可空性修正:把子表的
ATI_SITELAT字段设置为NOT NULL,与父表对应字段的约束保持一致。 - 移除单个字段的外键定义:删除子表中每个字段单独的
REFERENCES子句,避免约束冲突。
另外,父表DDL中的ATI_GSCOPE,缺少数据类型定义,会导致表创建失败,建议补充完整(例如ATI_GSCOPE TEXT,)。
内容的提问来源于stack exchange,提问作者OldAndRetired
相关产品推荐
相关产品推荐

