Ich habe folgendes eingerichtet:
CREATE TABLE auth_user ( id int PRIMARY KEY );
CREATE TABLE links_chatpicmessage ();
Ich versuche, eine Spalte hinzufügen genannt sender
zu links_chatpicmessage
denen ein Fremdschlüssel zu einer anderen Tabelle mit dem Namen auth_user
s‘ id
Spalte.
Um dies zu erreichen, versuche ich Folgendes auf dem Terminal:
ALTER TABLE links_chatpicmessage
ADD FOREIGN KEY (sender)
REFERENCES auth_user;
Aber das gibt mir einen Fehler:
FEHLER: Die Spalte "Absender", auf die in der Fremdschlüsseleinschränkung verwiesen wird, ist nicht vorhanden
Wie behebe ich das?
database
postgresql
foreign-keys
alter-table
Hassan Baig
quelle
quelle
Antworten:
So fügen Sie einer Spalte eine Einschränkung hinzu Es muss zuerst in der Tabelle
vorhanden sein. In Postgresql gibt es keinen Befehl, mit dem Sie die Spalte hinzufügen und gleichzeitig die Einschränkung hinzufügen können. Es müssen zwei separate Befehle sein.Sie können dies mit folgenden Befehlen tun:Machen Sie zuerst Folgendes:
ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;
Ich verwende hier
integer
als Typ, aber es sollte der gleiche Typ derid
Spalte derauth_user
Tabelle sein.Dann fügen Sie die Einschränkung hinzu
ALTER TABLE links_chatpicmessage ADD CONSTRAINT fk_someName FOREIGN KEY (sender) REFERENCES auth_user(column_referenced_name);
Der
ADD CONSTRAINT fk_someName
Teil dieses Befehls benennt Ihre Einschränkung. Wenn Sie diese also mit einem Tool dokumentieren müssen, das Ihr Modell erstellt, haben Sie eine benannte Einschränkung anstelle eines zufälligen Namens.Es dient auch Administratoren, sodass ein DBA weiß, dass die Einschränkung aus dieser Tabelle stammt.
Normalerweise benennen wir es mit einem Hinweis darauf, woher es stammt und wo es auf Ihren Fall verweist.
fk_links_chatpicmessage_auth_user
Jeder, der diesen Namen sieht, weiß genau, was diese Einschränkung ist, ohne eine komplexe Abfrage in INFORMATION_SCHEMA durchzuführen, um dies herauszufinden.BEARBEITEN
Wie in der Antwort von @ btubbs erwähnt, können Sie in einem Befehl tatsächlich eine Spalte mit einer Einschränkung hinzufügen. Wie so:
alter table links_chatpicmessage add column sender integer, add constraint fk_test foreign key (sender) references auth_user (id);
quelle
ALTER TABLE links_chatpicmessage ADD CONSTRAINT fk_links_chatpicmessage_auth_user FOREIGN KEY (sender) REFERENCES auth_user(id);
aber ich habe es immer nochcolumn "sender" referenced in foreign key constraint does not exist
. Ich vermisse etwas Grundlegendes, nehme ich an?ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER
Ich verwende hier eine Ganzzahl, aber es sollte der gleiche Typ sein wieauth_user (id)
I want to add a column
Teil Ihrer Frage verpasst habe . :)Sie können dies in Postgres in einer Zeile tun:
ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER REFERENCES auth_user (id);
Sie müssen keinen Namen manuell festlegen. Postgres nennt diese Einschränkung automatisch "links_chatpicmessage_auth_user_id_fkey".
quelle
Ich weiß, dass diese Antwort viel zu spät ist, und mir ist klar, dass dies dasselbe ist wie btubbs Einzeiler, nur ein wenig aussagekräftiger ...
Angenommen, Sie möchten auf den Primärschlüssel in der Tabelle auth_user verweisen und dieser Schlüsselname lautet 'id'.
Ich benutze diese Syntax:
ALTER TABLE links_chatpicmessage ADD COLUMN sender some_type, ADD FOREIGN KEY (sender) REFERENCES auth_user(id);
Hinweis: some_type = [Geben Sie dasselbe wie Absender in die Tabelle auth_user ein]
quelle
Die
CONSTRAINT
Klausel ist optional. Ich schlage vor, es wegzulassen und PostgreSQL immer die Einschränkung automatisch benennen zu lassen, ohne es zu benennen, erhalten Sie einen logischen NamenDas ist es, was Sie wahrscheinlich wissen möchten, wenn eine
INSERT
oderUPDATE
aufgrund einer Einschränkungsverletzung fehlschlägt.Syntax zum Hinzufügen eines Fremdschlüssels
All dies ist etwas dokumentiert
ALTER TABLE
Zu einer neuen Spalte
ALTER TABLE links_chatpicmessage ADD COLUMN sender int, ADD [CONSTRAINT foo] FOREIGN KEY (sender) REFERENCES auth_user(id);
Dies ist zusammengesetzt und transaktional. Sie können zwei
ALTER
Anweisungen für dieselbe Tabelle ausgeben, indem Sie die beiden Anweisungen durch a trennen,
.Zu einer bereits vorhandenen Spalte
-- assumes someone has already added the column or that it already exists ALTER TABLE links_chatpicmessage ADD COLUMN sender int; ALTER TABLE links_chatpicmessage ADD [CONSTRAINT foo] FOREIGN KEY (sender) REFERENCES auth_user(id);
quelle
**** Fremdschlüsselreferenz für vorhandene Spalte ****
ALTER TABLE Tabellenname ADD CONSTRAINT fkey_name AUSLÄNDISCHER SCHLÜSSEL (id) REFERENZEN ref_table (id)
quelle