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

SQLite删除CONFLUENCE_LINKS记录报外键不匹配错误

问题描述

我在SQLite中创建了以下三张表:

CREATE TABLE CONFLUENCE_LINKS (
    longLink        TEXT NOT NULL
                         PRIMARY KEY,
    shortLink       TEXT NOT NULL
                         DEFAULT [short link not found yet],
    dateLastUpdated TEXT NOT NULL
                         DEFAULT [last updated date will be added soon]
);

CREATE TABLE LOG_CONFLUENCE_PAGES_TO_FIX (
    shortLink             TEXT    NOT NULL
                                  PRIMARY KEY,
    dateChecked           TEXT    NOT NULL,
    numDaysMissingAltText INTEGER NOT NULL,
    FOREIGN KEY (
        shortLink
    )
    REFERENCES CONFLUENCE_LINKS (shortLink) ON DELETE CASCADE
                                            ON UPDATE CASCADE
);

CREATE TABLE CONFLUENCE_PAGES_MISSING_ALT_TEXT (
    shortLink       TEXT NOT NULL
                         PRIMARY KEY,
    pageName        TEXT NOT NULL,
    hasImages       TEXT NOT NULL
                         DEFAULT FALSE,
    hasAltText      TEXT NOT NULL
                         DEFAULT FALSE,
    imageNamesLinks TEXT NOT NULL,
    FOREIGN KEY (
        shortLink
    )
    REFERENCES CONFLUENCE_LINKS (shortLink) ON DELETE CASCADE
                                            ON UPDATE CASCADE

完成表创建后,我向CONFLUENCE_LINKS表插入了一行记录:

INSERT INTO CONFLUENCE_LINKS (longLink) VALUES ("espn.com")

随后我尝试通过SQLiteStudio的GUI按钮删除该行并提交更改,SQL执行失败,返回如下错误:

Error while deleting row from table CONFLUENCE_LINKS: foreign key mismatch - "CONFLUENCE_PAGES_MISSING_ALT_TEXT" referencing "CONFLUENCE_LINKS"

按照常规外键报错逻辑,如果父表CONFLUENCE_LINKS中被删除的数据被子表引用才会触发错误,但当前CONFLUENCE_PAGES_MISSING_ALT_TEXT表为空,没有任何数据,无法定位报错原因。
运行环境:Linux Mint 20
编辑补充:此前遗漏了一张关键表的定义,现已补充到上述表结构内容中。

报错原因

这个foreign key mismatch错误和子表有没有数据完全无关,是你定义的外键本身不符合SQLite的约束规则:

  • SQLite强制要求,外键引用的父表字段,必须是父表的主键,或者是加了UNIQUE唯一约束、建有唯一索引的字段,否则外键定义本身就是非法的。
  • 你的CONFLUENCE_LINKS表主键是longLink字段,被两个子表引用的shortLink字段只设置了非空和默认值约束,没有加唯一约束,不满足外键引用的要求。
  • 只要外键定义非法,不管子表里有没有匹配的引用行,只要对父表执行删、改操作,都会直接抛出这个mismatch错误,根本不会走到检查子表数据的步骤。

另外你贴出的CONFLUENCE_PAGES_MISSING_ALT_TEXT建表语句末尾缺少闭合的括号和分号,属于语法问题,也需要修正。

修复方案

根据你的业务逻辑二选一即可:

  • 如果确实需要通过shortLink做关联,给CONFLUENCE_LINKS表的shortLink字段加上唯一约束:
CREATE TABLE CONFLUENCE_LINKS (
    longLink        TEXT NOT NULL
                         PRIMARY KEY,
    shortLink       TEXT NOT NULL UNIQUE
                         DEFAULT [short link not found yet],
    dateLastUpdated TEXT NOT NULL
                         DEFAULT [last updated date will be added soon]
);
  • 如果业务上是通过longLink做关联,就把两个子表的外键字段改成引用CONFLUENCE_LINKS.longLink,同时子表中存储对应的longLink值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:57:28