SQLite 3中空表的奇怪外键行为

本教程将介绍SQLite 3中空表的奇怪外键行为的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

SQLite 3中空表的奇怪外键行为 教程 第1张

问题描述

我的 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中空表的奇怪外键行为的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。