Merkwürdiges Fremdschlüsselverhalten bei leeren Tabellen in SQLite 3
Ich habe SQLite 3 mit folgendem Setup (vereinfacht):
create table Location(LocationId integer not null,
LocationCode text not null,
primary key(LocationId),
unique(LocationCode));
Die obige Tabelle wird von der Abteilung referenziert:
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));
Die obige Tabelle wird von Child referenziert:
create table Event(EventId integer not null,
LocationId integer not null,
unique(LocationId, EventDate),
primary key(eventId),
foreign key(LocationId) references Location(LocationId));
Die Tabelle über der Referenztabelle
create table Parent(ParentId integer not null,
EmailAddress text not null,
primary key(ParentId),
unique(EmailAddress));
Die obige Tabelle wird von der Tabelle Child referenziert:
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));
Das Tabellenkind ist dasjenige, von dem ich versuche, es zu löschen.
Zu diesem Zeitpunkt ist die gesamte Datenbank leer und hat "pragma foreign_keys = ON".
Beim Testen eines Skripts zum Löschen der Datenbank ist beim Löschen aus der leeren Tabelle ein Fehler aufgetretenChild
einen Fremdschlüssel für die (auch leere) Tabelle habenParent
.
Wenn ich den Befehl erteiledelete from child
(solange bereits leer ist), kehrt SQLite3 mit der Fehlermeldung "Fremdschlüssel stimmen nicht überein" zurück.
Dies ist der entscheidende Teil des Löschskripts:
delete from Child;
delete from Parent;
delete from Event;
delete from Department;
delete from Location;
Ich habe hier einige Posts über die vorübergehende Deaktivierung der Fremdschlüsselunterstützung gesehen, aber das ergibt für mich keinen Sinn. Dies macht den gesamten Prozess der Implementierung einer Fremdschlüsselbeziehung überflüssig.