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:
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:
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.
Stellen Sie die FOREIGN KEY-Definition an das Ende der SQL-Anweisung
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:
Ü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. ‘.