You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
);

关键修正点说明

  1. 复合外键约束:将原本分散的单个字段外键合并为一个包含所有5个关联字段的外键约束,确保与父表复合主键的列顺序完全一致。
  2. 字段可空性修正:把子表的ATI_SITELAT字段设置为NOT NULL,与父表对应字段的约束保持一致。
  3. 移除单个字段的外键定义:删除子表中每个字段单独的REFERENCES子句,避免约束冲突。

另外,父表DDL中的ATI_GSCOPE,缺少数据类型定义,会导致表创建失败,建议补充完整(例如ATI_GSCOPE TEXT,)。

内容的提问来源于stack exchange,提问作者OldAndRetired

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 16:33:26