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
相关产品推荐
相关产品推荐

