私は次のセットアップ(簡略化)を備えたSQLite3を持っています:
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));
テーブルの子は、削除しようとしているものです。
この時点で、データベース全体が空になり、「pragmaforeign_keys=ON」になります。
データベースをクリアするためのスクリプトをテストしているときにChild
、外部キーを持つ空のテーブルから(これも空の)テーブルに削除しているときにエラーが発生しましたParent
。
コマンドを発行するとdelete from child
(すでに空の状態です)、SQLite3は「外部キーの不一致」というエラーメッセージを返します。
これは、削除スクリプトの重要な部分です。
delete from Child;
delete from Parent;
delete from Event;
delete from Department;
delete from Location;
ここで、外部キーのサポートを一時的に無効にすることについての投稿をいくつか見ましたが、それは私には意味がありません。これにより、外部キー関係を実装するプロセス全体が不要になります。