it-swarm.com.de

SQLite-Fremdschlüssel

Ich befolge die Anweisungen in der SQLite-Dokumentation unter http://www.sqlite.org/foreignkeys.html . Mein Versuch, einen Fremdschlüssel hinzuzufügen, schlägt jedoch fehl. Hier sind meine Erstellungsanweisungen:

CREATE TABLE 
    checklist (
        _id INTEGER PRIMARY KEY AUTOINCREMENT, 
        checklist_title TEXT,
        description TEXT,
        created_on INTEGER, 
        modified_on INTEGER
    );

CREATE TABLE 
    item (
        _id INTEGER PRIMARY KEY AUTOINCREMENT,  
        FOREIGN KEY(checklist_id) REFERENCES checklist(_id), 
        item_text TEXT, item_hint TEXT, 
        item_order INTEGER, 
        created_on INTEGER, 
        modified_on INTEGER
    );

Der erste Tisch ist gut gemacht. Der Fehler tritt in der zweiten Anweisung auf. Ich habe beide versucht, die beiden Abfragen in einer Transaktion und ohne einzuwickeln. Hier ist der Fehler:

unbekannte Spalte "checklist_id" in der Fremdschlüsseldefinition (Code 1):, während des Kompilierens: CREATE TABLE-Element (_id INTEGER PRIMARY KEY-AUTOINCREMENT, FOREIGN KEY (checklist_id) REFERENCES Checkliste (_id), item_text TEXT, item_hint TEXT, item_order INTEGER , modified_on INTEGER)

39
Geeks On Hugs

Sie müssen die Spalte checklist_id INTEGER noch erstellen, bevor Sie sie als Fremdschlüssel hinzufügen.

So wäre es:

CREATE TABLE 
    checklist (
        _id INTEGER PRIMARY KEY AUTOINCREMENT, 
        checklist_title TEXT,
        description TEXT,
        created_on INTEGER, 
        modified_on INTEGER
    );

CREATE TABLE 
    item (
        _id INTEGER PRIMARY KEY AUTOINCREMENT,  
        checklist_id INTEGER,
        item_text TEXT, 
        item_hint TEXT, 
        item_order INTEGER, 
        created_on INTEGER, 
        modified_on INTEGER,
        FOREIGN KEY(checklist_id) REFERENCES checklist(_id)
    );
73
Scen

Sie fehlen einfach die checklist_id-Spalte in Ihrer item table. Sie müssen es deklarieren, bevor Sie es als FOREIGN KEY festlegen möchten. Sie haben versucht, FK in einer nicht vorhandenen Spalte zu erstellen, und deshalb funktioniert sie nicht.

Sie müssen also folgendes hinzufügen:

checklist_id INTEGER,
FOREIGN KEY(checklist_id) REFERENCES checklist(_id)

jetzt sollte es funktionieren.

4
Simon Dorociak

Sie müssen den Spaltennamen angeben, bevor Sie ihn mit FOREIGN KEY () umschließen.

CREATE TABLE 
    item (
        _id INTEGER PRIMARY KEY AUTOINCREMENT,  
        checklist_id INTEGER,
        FOREIGN KEY(checklist_id) REFERENCES checklist(_id), 
        item_text TEXT, item_hint TEXT, 
        item_order INTEGER, 
        created_on INTEGER, 
        modified_on INTEGER
    );
3
lorraine

Setzen Sie die Definition von FOREIGN KEY am Ende der SQL-Anweisung

2
rudakovsky

Ich denke, dass die obigen Antworten nicht ganz richtig sind oder zumindest etwas irreführend sind. Sie können die Spalte erstellen und dann in einer separaten Zeile eine Fremdschlüsseleinschränkung hinzufügen. Dies wird als Angabe einer Tabelleneinschränkung bezeichnet.

Es gibt aber auch eine kürzere Syntax: Bei Anwendung auf nur eine Spalte können alle 4 möglichen Einschränkungen (PRIMARY KEY, UNIQUE, CHECK, FOREIGN KEY) auch inline (wie beispielsweise NOT NULL) als Spaltenbedingung angegeben werden. D.h. Du kannst schreiben:

CREATE TABLE 
item (
    _id INTEGER PRIMARY KEY AUTOINCREMENT,  
    checklist_id REFERENCES checklist(_id), 
    item_text TEXT, item_hint TEXT, 
    item_order INTEGER, 
    created_on INTEGER, 
    modified_on INTEGER
);

Übrigens, wenn Sie sich über die richtige Syntax nicht sicher sind, hat die offizielle Dokumentation wirklich schöne Eisenbahndiagramme.

0
szmate1618