SQLite-Fremdschlüssel

Lesezeit: 4 Minuten

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

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
    );

Die erste Tabelle ist gut gemacht. Der Fehler tritt in der zweiten Anweisung auf. Ich habe beides versucht, indem ich die beiden Abfragen in eine Transaktion gepackt habe und ohne. Hier ist der Fehler:

unbekannte Spalte “checklist_id” in Fremdschlüsseldefinition (Code 1): , beim Kompilieren: 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)

Benutzer-Avatar
Szene

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

Es wäre also:

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)
    );

Du fehlst einfach checklist_id Spalte in Ihrer Artikel Tisch. Sie müssen es deklarieren, bevor Sie es als festlegen möchten FOREIGN KEY. Du hast versucht zu erschaffen FK auf nicht vorhandene Spalte und das ist der Grund, warum es nicht funktioniert.

Sie müssen also Folgendes hinzufügen:

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

jetzt sollte es funktionieren.

Sie müssen den Spaltennamen einschließen, 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
    );

Stellen Sie die FOREIGN KEY-Definition an das Ende der SQL-Anweisung

Benutzer-Avatar
szmate1618

Ich denke, die obigen Antworten sind nicht ganz richtig oder zumindest leicht irreführend. Wie sie richtig darauf hingewiesen haben, können Sie 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 nur auf 1 Spaltealle 4 möglichen Beschränkungen (PRIMARY KEY, UNIQUE, CHECK, FOREIGN KEY) kann auch inline angegeben werden (like NOT NULL, zum Beispiel) als Spalteneinschränkung. D.h. man kann 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 jemals unsicher über die korrekte Syntax sind, die amtliche Dokumentation hat wirklich schöne Eisenbahndiagramme.

  • Warum sollte jemand eine UNIQUE-Einschränkung für einen Fremdschlüssel wollen? Normalerweise platzieren Sie in einer 1: N-Beziehung die Fremdschlüsselspalte in der Tabelle der N-Entität, um auf die übergeordnete Entität 1 zu verweisen. Daher gibt es viele Zeilen in der N-Tabelle, die sich auf dieselbe Zeile beziehen. Die UNIQUE-Einschränkung würde das nicht verhindern? Verstehe ich etwas falsch?

    – Csaba Toth

    11. September 2020 um 4:01 Uhr

  • Das letzte Beispiel für sqlite.org/foreignkeys.html#fk_indexes zeigt die Abkürzung REFERENCES und gibt nicht die übergeordnete Spalte an, sondern nur die übergeordnete Tabelle (ich denke, das System zieht die Spalte als Primärschlüssel der übergeordneten Tabelle ab). Es ist jedoch eine explizite Anweisung zur Indexerstellung erforderlich.

    – Csaba Toth

    11. September 2020 um 4:08 Uhr

  • Entschuldigung, ich meinte nicht, dass Sie kombinieren sollten oder könnten UNIQUE und REFERENCES. Sie können nur das eine oder das andere auswählen, nicht beide. Was Ihre zweite Frage betrifft, ja, die Spalten werden abgezogen, es sei denn, die untergeordnete Tabelle verweist auf den Primärschlüssel des übergeordneten Elements, ohne die Primärschlüsselspalten anzugeben, und die Anzahl der Primärschlüsselspalten im übergeordneten Element stimmt nicht mit der Anzahl der untergeordneten Schlüsselspalten überein. ‘.

    – szmate1618

    11. September 2020 um 12:17 Uhr

  • Warum sollte jemand eine UNIQUE-Einschränkung für einen Fremdschlüssel wollen? Normalerweise platzieren Sie in einer 1: N-Beziehung die Fremdschlüsselspalte in der Tabelle der N-Entität, um auf die übergeordnete Entität 1 zu verweisen. Daher gibt es viele Zeilen in der N-Tabelle, die sich auf dieselbe Zeile beziehen. Die UNIQUE-Einschränkung würde das nicht verhindern? Verstehe ich etwas falsch?

    – Csaba Toth

    11. September 2020 um 4:01 Uhr

  • Das letzte Beispiel für sqlite.org/foreignkeys.html#fk_indexes zeigt die Abkürzung REFERENCES und gibt nicht die übergeordnete Spalte an, sondern nur die übergeordnete Tabelle (ich denke, das System zieht die Spalte als Primärschlüssel der übergeordneten Tabelle ab). Es ist jedoch eine explizite Anweisung zur Indexerstellung erforderlich.

    – Csaba Toth

    11. September 2020 um 4:08 Uhr

  • Entschuldigung, ich meinte nicht, dass Sie kombinieren sollten oder könnten UNIQUE und REFERENCES. Sie können nur das eine oder das andere auswählen, nicht beide. Was Ihre zweite Frage betrifft, ja, die Spalten werden abgezogen, es sei denn, die untergeordnete Tabelle verweist auf den Primärschlüssel des übergeordneten Elements, ohne die Primärschlüsselspalten anzugeben, und die Anzahl der Primärschlüsselspalten im übergeordneten Element stimmt nicht mit der Anzahl der untergeordneten Schlüsselspalten überein. ‘.

    – szmate1618

    11. September 2020 um 12:17 Uhr

1013850cookie-checkSQLite-Fremdschlüssel

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy