不相关记录的删除命令上的外键不匹配

rss*_*919 5 sqlite foreign-keys mismatch

我定义了以下5个表,在第1个表中插入了一些记录。这是使用sqlite 3.7.1.7启用了外键约束。

create table if not exists subject (id varchar(50) primary key,desc varchar(100));
insert into subject (id,desc) values ("subject1","test subject");

create table if not exists subjectlevel (id_subject_id varchar(50) references subject(id) on delete cascade, id integer not null, desc varchar(100) not null, questmcmaxselections integer not null, primary key (id_subject_id,id));

insert into subjectlevel (id_subject_id,id,desc,questmcmaxselections) values ("subject1",1,"test subject1 level 1",4);

insert into subjectlevel (id_subject_id,id,desc,questmcmaxselections) values ("subject1",2,"test subject1 level 2",4);

create table if not exists questmc (id integer primary key, text varchar(300) not null, includeallanswers int not null, subject_id varchar(50), subjectlevel_id integer, foreign key (subject_id, subjectlevel_id) references subjectlevel (id_subject_id,id) on delete cascade); 

insert into questmc (text,includeallanswers,subject_id,subjectlevel_id) values ("this is a _ question", 1, "subject1",1);

create table if not exists questmcselection (id integer primary key, text varchar(100) not null, subject_id varchar(50), subjectlevel_id integer, foreign key (subject_id, subjectlevel_id) references subjectlevel (id_subject_id,id) on delete cascade);

insert into questmcselection (text,subject_id,subjectlevel_id) values ("this is a solution","subject1",1);

create table if not exists questmc_questmcselection(id integer primary key, answer integer not null, questmc_id integer, questmcselection_id integer, subject_id varchar(50), subjectlevel_id integer, foreign key (questmc_id) references questmc(id) on delete cascade, foreign key (questmcselection_id) references questmcselection (id) on delete cascade, foreign key (subject_id,subjectlevel_id) references questmc (subject_id,subjectlevel_id) on delete cascade, foreign key (subject_id,subjectlevel_id) references questmcselection (subject_id,subjectlevel_id));
Run Code Online (Sandbox Code Playgroud)

如果我尝试删除主题级别表中的第二条记录,只要定义了表questmc_questmcselection,我都会得到外键不匹配错误。

sqlite> delete from subjectlevel where id=2;
Error: foreign key mismatch - "questmc_questmcselection" referencing "questmcselection"
Run Code Online (Sandbox Code Playgroud)

questmc,questmcselection和questmc_questmcselection没有相关的现有记录,应防止此删除。知道为什么会发生此错误吗?

CL.*_*CL. 4

此错误与此特定记录无关subjectlevel

您的问题是您的表缺少所需的索引。之前没有报告这一点,因为该DELETE语句是第一个需要 SQLite 检查数据库模式一致性的命令。

  • 在CL的帮助下得到了它。表 A 和 B 应在其键中包含 id 和 type。这就是 CL 所指的唯一索引。表 C 应包括 3 个字段(aid、bid、type)和 2 个 fkey 约束,如下所示。外键(aid,type)引用A(id,type),外键(bid,type)引用B(id,type)这允许您将A和B中的2条记录链接到表C中,前提是它们共享相同的类型价值。感谢您对 CL 的帮助。 (2认同)