Ich habe noch nie einen Code für die Objekterstellung für SQL Server "handcodiert", und die Dekleration von Fremdschlüsseln scheint sich zwischen SQL Server und Postgres zu unterscheiden. Hier ist meine SQL bisher:
drop table exams;
drop table question_bank;
drop table anwser_bank;
create table exams
(
exam_id uniqueidentifier primary key,
exam_name varchar(50),
);
create table question_bank
(
question_id uniqueidentifier primary key,
question_exam_id uniqueidentifier not null,
question_text varchar(1024) not null,
question_point_value decimal,
constraint question_exam_id foreign key references exams(exam_id)
);
create table anwser_bank
(
anwser_id uniqueidentifier primary key,
anwser_question_id uniqueidentifier,
anwser_text varchar(1024),
anwser_is_correct bit
);
Wenn ich die Abfrage ausführe, wird folgende Fehlermeldung angezeigt:
Meldung 8139, Ebene 16, Status 0, Zeile 9 Die Anzahl der referenzierenden Spalten im Fremdschlüssel unterscheidet sich von der Anzahl der referenzierten Spalten in der Tabelle 'question_bank'.
Können Sie den Fehler erkennen?
sql
sql-server
tsql
mmattax
quelle
quelle
Antworten:
quelle
Und wenn Sie die Einschränkung nur selbst erstellen möchten, können Sie ALTER TABLE verwenden
Ich würde die von Sara Chipps erwähnte Syntax für die Inline-Erstellung nicht empfehlen, nur weil ich lieber meine eigenen Einschränkungen benennen möchte.
quelle
Sie können Ihre Fremdschlüsseleinschränkung auch folgendermaßen benennen:
quelle
Ich mag die Antwort von AlexCuse, aber etwas, auf das Sie achten sollten, wenn Sie eine Fremdschlüsseleinschränkung hinzufügen, ist, wie Aktualisierungen der referenzierten Spalte in einer Zeile der referenzierten Tabelle behandelt werden sollen und insbesondere, wie Sie Zeilen in der referenzierten Tabelle löschen möchten zu behandelnder Tisch.
Wenn eine Einschränkung wie folgt erstellt wird:
.. dann werden Aktualisierungen oder Löschungen in der referenzierten Tabelle mit einem Fehler angezeigt, wenn die referenzierende Tabelle eine entsprechende Zeile enthält.
Das mag das Verhalten sein, das Sie wollen, aber meiner Erfahrung nach ist es viel häufiger nicht so.
Wenn Sie es stattdessen so erstellen:
..dann führen Aktualisierungen und Löschungen in der übergeordneten Tabelle zu Aktualisierungen und Löschungen der entsprechenden Zeilen in der Referenzierungstabelle.
(Ich schlage nicht vor, dass die Standardeinstellung geändert werden sollte, die Standardeinstellung ist auf der Seite der Vorsicht, was gut ist. Ich sage nur, dass eine Person, die Konstanten erstellt, immer darauf achten sollte .)
Dies kann übrigens beim Erstellen einer Tabelle wie folgt erfolgen:
quelle
- Das wird auch funktionieren. Pehaps ein bisschen intuitiver konstruieren?
quelle
So erstellen Sie einen Fremdschlüssel für eine beliebige Tabelle
quelle
Wenn Sie mithilfe einer Abfrage zwei Tabellenspalten zu einer Beziehung erstellen möchten, versuchen Sie Folgendes:
quelle
Wie Sie erstelle ich normalerweise keine Fremdschlüssel von Hand, aber wenn ich aus irgendeinem Grund das Skript dazu benötige, erstelle ich es normalerweise mit ms sql server management studio und bevor ich Änderungen speichere, wähle ich Table Designer | Änderungsskript generieren
quelle
In diesem Skript geht es darum, Tabellen mit Fremdschlüssel zu erstellen, und ich habe den SQL-Server für die Einschränkung der referenziellen Integrität hinzugefügt .
quelle
Nekromantie.
Eigentlich ist es etwas schwieriger, dies richtig zu machen.
Sie müssen zunächst überprüfen, ob der Primärschlüssel für die Spalte vorhanden ist, auf die Sie Ihren Fremdschlüssel verweisen möchten.
In diesem Beispiel wird ein Fremdschlüssel in der Tabelle T_ZO_SYS_Language_Forms erstellt, der auf dbo.T_SYS_Language_Forms.LANG_UID verweist
quelle
Ich verwende immer diese Syntax, um die Fremdschlüsseleinschränkung zwischen zwei Tabellen zu erstellen
dh
quelle