Ich habe die folgenden Tabellen,
CREATE TABLE users (id int PRIMARY KEY);
-- already exists with data
CREATE TABLE message ();
Wie ändere ich die messages
Tabelle so, dass,
- Eine neue Spalte mit dem Namen
sender
wird hinzugefügt - Wo
sender
ist ein Fremdschlüssel, der auf dieusers
Tabelle verweist ?
Das hat nicht funktioniert
# ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users;
ERROR: column "sender" referenced in foreign key constraint does not exist
Erstellt diese Anweisung nicht auch die Spalte?
postgresql
foreign-key
alter-table
Hassan Baig
quelle
quelle
Antworten:
Was relativ einfach ist - Sie müssen nur einen weiteren Schritt hinzufügen.
Die
FOREIGN KEY
Spalte muss vorhanden sein, um sie zu einer zu machenFK
. Ich habe folgendes gemacht (von hier und der Dokumentation ):Ein paar Punkte zu beachten:
IMMER Ihre Fremdschlüssel aussagekräftige Namen geben. Es ist nicht sehr hilfreich zu erfahren, dass der Schlüssel "SYS_C00308108" verletzt wird. In der Geige finden Sie Informationen zum Verhalten von Oracle unter diesen Umständen. Der Schlüsselname variiert von Geige zu Geige, ist jedoch eine beliebige Zeichenfolge, die mit SYS beginnt.
In Anbetracht Ihrer Aussage:
Es wäre "schön zu haben", wenn das RDBMS automatisch das gewünschte Feld mit dem Datentyp erstellen könnte, der mit dem referenzierten Feld übereinstimmt. Ich würde nur sagen, dass das Ändern von DDL eine selten verwendete Operation ist (oder zumindest sein sollte) und nicht etwas, das Sie regelmäßig durchführen möchten. Es besteht auch die Gefahr, dass eine bereits ziemlich umfangreiche Dokumentation ergänzt wird.
Zumindest versucht PostgreSQL, etwas Vernünftiges zu tun - es verkettet den Tabellennamen, den
FOREIGN KEY
Feldnamen und_fkey
fügt sogarDETAIL: Key (sender_id)=(56) is not present in table "user_".
etwas hinzu, das für einen Menschen sinnvoll sein könnte - siehe Geige hier .quelle
"y_z_fkey"
. Ich würde behaupten , dass es einen besseren Namen alsy_x_fkey
wegen Ihrer Verletzung Ihnen nicht sagen , die Spalte Sie sind Einfügen in das verursacht den Fehler. Es ist mir weniger wichtig, wohin es zeigt. Als allgemeine Regel sollten Sie niemals Ihre F - Tasten damit umgehen PostgreSQLs Standardnamen und lassen.ON UPDATE CASCADE ON DELETE CASCADE;
in einem Beispiel nicht überschreiben , insbesondere nicht ohne Grund. Dadurch wird das Beispiel komplexer, und Sie müssen nicht erklären, was es ist. Normalerweise möchte ich nicht, dass Löschungen kaskadieren.y_x_fkey
odery_z_fkey
oderx__y_FK
, solange es konsistent ist.Ich bin mir nicht sicher, warum Ihnen alle sagen, dass Sie dies in zwei Schritten tun müssen. Tatsächlich tust du das nicht . Sie haben versucht, eine hinzuzufügen,
FOREIGN KEY
die davon ausgeht, dass die Spalte vorhanden ist, und diesen Fehler auslöst, wenn die Spalte nicht vorhanden ist. Wenn Sie das hinzufügenCOLUMN
, können Sie es explizit zu einerFOREIGN KEY
On-Erstellung machen mitREFERENCES
:Wird gut funktionieren. Sie können die Syntax von
ALTER TABLE
hier sehen,Mit "Aktion" als,
Diese Beispiele finden Sie sogar in den Dokumenten.
All dies wird jedoch nicht benötigt, da wir uns auf die automatische Benennung und die Primärschlüsselauflösung verlassen können (wenn nur der Tabellenname angegeben wird, verweisen Sie auf den Primärschlüssel).
quelle
FALL1: Wenn Sie beim Erstellen einer neuen Tabelle einen Fremdschlüssel erstellen müssen
Mit den obigen Befehlen wird eine Tabelle mit dem Namen 'table1' und drei Spalten mit den Namen 'id' (Primärschlüssel), 'column1', 'table2_id' (Fremdschlüssel von Tabelle1, der auf die ID-Spalte von Tabelle2 verweist) erstellt.
DATATYPE 'serial' erstellt die Spalte, die diesen Datentyp als automatisch generierte Spalte verwendet. Wenn Sie Werte in die Tabelle einfügen, müssen Sie diese Spalte überhaupt nicht erwähnen, oder Sie können 'default' ohne Anführungszeichen an der Wertstelle angeben.
Dem Index der Tabelle wird immer eine Primärschlüsselspalte mit dem Wert 'tablename_pkey' hinzugefügt.
Wenn zum Zeitpunkt der Tabellenerstellung ein Fremdschlüssel hinzugefügt wird, wird ein CONSTRAINT mit dem Muster '(vorhandener_Tabellenname) _ (Fremdschlüssel_ID_Name) _fkey' hinzugefügt.
Wenn wir einen Fremdschlüssel hinzufügen, müssen wir das Schlüsselwort 'REFERENCES' neben dem Spaltennamen eingeben, da wir den Postgres mitteilen möchten, dass diese Spalte auf eine Tabelle verweist, und dann neben den Verweisen die Tabelle als Referenz angeben und in Klammern die Spaltenname der referenzierten Tabelle, normalerweise werden Fremdschlüssel als Primärschlüsselspalten angegeben.
FALL 2: Wenn Sie einen Fremdschlüssel für eine vorhandene Tabelle in einer vorhandenen Spalte wünschen
HINWEIS: Klammern '()' nach FOREIGN KEY und REFERENCES tabel2 sind obligatorisch, da sonst Postgres einen Fehler auslösen.
quelle