1

私は次のセットアップ(簡略化)を備えた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;

ここで、外部キーのサポートを一時的に無効にすることについての投稿をいくつか見ましたが、それは私には意味がありません。これにより、外部キー関係を実装するプロセス全体が不要になります。

4

1 に答える 1

2

ドキュメント(ソースコードに隠されています)には次のように書かれています:

外部キー制約では、親テーブルのキー列がまとめて UNIQUE または PRIMARY KEY 制約を受ける必要があります。[…] 次のいずれかの理由で、必要なインデックスが見つからない場合:

  1. 指定された親キー列が存在しないか、または
  2. 指定された親キー列は存在しますが、UNIQUE または PRIMARY KEY 制約の対象ではありません。または
  3. 外部キー定義の一部として親キー列が明示的に提供されておらず、親テーブルに PRIMARY KEY がない、または
  4. 外部キー定義の一部として親キー列が明示的に提供されておらず、親テーブルの PRIMARY KEY は、子テーブルの子キーとは異なる数の列で構成されています。

次に…「外部キーの不一致」エラー[発生]。

> DELETE FROM Child;
Error: foreign key mismatch
> CREATE UNIQUE INDEX di ON Department(DepartmentId);
> DELETE FROM Child;
> 
于 2013-03-18T08:16:54.993 に答える