Ich habe folgende Tabelle:
CREATE TABLE child(
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT);
Wie füge ich eine Fremdschlüsseleinschränkung hinzu parent_id
? Angenommen, Fremdschlüssel sind aktiviert.
In den meisten Beispielen wird davon ausgegangen, dass Sie die Tabelle erstellen. Ich möchte die Einschränkung einer vorhandenen hinzufügen.
sql
sqlite
foreign-keys
ddl
Däne O'Connor
quelle
quelle
Antworten:
Das kannst du nicht.
Die SQL-92-Syntax zum Hinzufügen eines Fremdschlüssels zu Ihrer Tabelle lautet zwar wie folgt:
SQLite unterstützt die
ADD CONSTRAINT
Variante desALTER TABLE
Befehls nicht ( sqlite.org: SQL-Funktionen, die SQLite nicht implementiert ).Daher können Sie in sqlite 3.6.1 nur
CREATE TABLE
wie folgt einen Fremdschlüssel hinzufügen :Leider müssen Sie die vorhandenen Daten in einer temporären Tabelle speichern, die alte Tabelle löschen, die neue Tabelle mit der FK-Einschränkung erstellen und die Daten dann wieder aus der temporären Tabelle kopieren. ( sqlite.org - FAQ: Q11 )
quelle
RENAME TO
ist eine der wenigenALTER TABLE
Varianten, die derzeit in SQLite 3 unterstützt wird.Sie können die Einschränkung hinzufügen, wenn Sie die Tabelle ändern und die Spalte hinzufügen, die die Einschränkung verwendet.
Erstellen Sie zunächst eine Tabelle ohne die parent_id:
Ändern Sie dann die Tabelle:
quelle
Bitte überprüfen Sie https://www.sqlite.org/lang_altertable.html#otheralter
quelle
Ja, Sie können, ohne eine neue Spalte hinzuzufügen. Sie müssen vorsichtig sein, um eine korrekte Beschädigung der Datenbank zu vermeiden. Daher sollten Sie Ihre Datenbank vollständig sichern, bevor Sie dies versuchen.
für Ihr spezifisches Beispiel:
oder allgemeiner:
In beiden Fällen möchten Sie wahrscheinlich zuerst die SQL-Definition überprüfen, bevor Sie Änderungen vornehmen:
Wenn Sie den replace () -Ansatz verwenden, ist es möglicherweise hilfreich, vor der Ausführung zunächst den Befehl replace () zu testen, indem Sie Folgendes ausführen:
quelle
Wenn Sie den Firefox-Add-On-SQLite-Manager verwenden, können Sie Folgendes tun:
Anstatt die Tabelle zu löschen und erneut zu erstellen, kann man sie einfach so ändern.
Klicken Sie im Textfeld Spalten mit der rechten Maustaste auf den zuletzt aufgelisteten Spaltennamen, um das Kontextmenü aufzurufen, und wählen Sie Spalte bearbeiten. Beachten Sie, dass, wenn die letzte Spalte in der TABLE-Definition der PRIMARY KEY ist, zuerst eine neue Spalte hinzugefügt und dann der Spaltentyp der neuen Spalte bearbeitet werden muss, um die FOREIGN KEY-Definition hinzuzufügen. Fügen Sie im Feld Spaltentyp ein Komma und das
Definition nach Datentyp. Klicken Sie auf die Schaltfläche Ändern und dann im Dialogfeld Gefährlicher Betrieb auf die Schaltfläche Ja.
Referenz: Sqlite Manager
quelle
Sie können dies versuchen:
quelle
Grundsätzlich können Sie nicht, aber Sie können die Situation umgehen.
Der richtige Befehl zum Hinzufügen der Fremdschlüsseleinschränkung zu einer vorhandenen Tabelle ist der folgende Befehl.
Kopieren Sie dann die parent_Id- Daten in die newCol und löschen Sie die Parent_Id- Spalte. Daher ist keine temporäre Tabelle erforderlich.
quelle
Fügen Sie zuerst eine Spalte in die untergeordnete Tabelle ein
Cid
,int
dannalter table
mit dem folgenden Code. Auf diese Weise können Sie den FremdschlüsselCid
als Primärschlüssel der übergeordneten Tabelle hinzufügen und als Fremdschlüssel in der untergeordneten Tabelle verwenden. Ich hoffe, er hilft Ihnen, da er gut für mich ist:quelle