SQLite 3中空表的奇怪外键行为
本教程将介绍SQLite 3中空表的奇怪外键行为的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。
问题描述
我的 SQLite 3 具有以下设置(简化):
create table Location(LocationId integer not null,
LocationCode text not null,
primary key(LocationId),
unique(LocationCode));
上表被部门引用:
create table Department(DepartmentId integer not null,
LocationId integer not null,
DepartmentCode text not null,
primary key(LocationId, DepartmentCode),
foreign key(LocationId) references Location(LocationId));
上表被 Child 引用:
create table Event(EventId integer not null,
LocationId integer not null,
unique(LocationId, EventDate),
primary key(eventId),
foreign key(LocationId) references Location(LocationId));
上表参考表格位置:
create table Parent(ParentId integer not null,
EmailAddress text not null,
primary key(ParentId),
unique(EmailAddress));
上面的表格被表格Child引用:
create table Child(ChildId integer not null,
ParentId integer not null,
ChildCode text not null,
DepartmentId integer not null,
primary key(ChildId, ParentId),
foreign key(ParentId) references Parent(ParentId),
foreign key(DepartmentId) references Department(DepartmentId));
表子是我要从中删除的那个.
此时,整个数据库是空的,并且有pragma foreign_keys=ON".
在测试清除数据库的脚本时,我在从空表 Child
中删除时遇到了错误,该表具有(也是空的)表 Parent
的外键.
当我发出命令 delete from child
(虽然已经为空),SQLite3 会返回错误消息外键不匹配".
这是删除脚本的重要部分:
delete from Child;
delete from Parent;
delete from Event;
delete from Department;
delete from Location;
我在这里看到了一些关于暂时禁用外键支持的帖子,但这对我来说没有意义.这使得实现外键关系的整个过程变得不必要.
推荐答案
文档(隐藏在源代码中)说:
外键约束要求父项中的键列table 共同受 UNIQUE 或 PRIMARY KEY 约束.[…]如果找不到所需的索引,可能是因为:
指定的父键列不存在,或
命名的父键列确实存在,但不受UNIQUE 或 PRIMARY KEY 约束,或
没有明确提供父键列作为外键定义,并且父表没有主键,或
没有明确提供父键列作为外键定义,以及父表的 PRIMARY KEY由与子键不同数量的列组成子表.
然后……[引发]外键不匹配"错误.
> DELETE FROM Child;
Error: foreign key mismatch
> CREATE UNIQUE INDEX di ON Department(DepartmentId);
> DELETE FROM Child;
>
好了关于SQLite 3中空表的奇怪外键行为的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。