Ich habe folgendes eingerichtet,
CREATE TABLE auth_user ( id int PRIMARY KEY );
CREATE TABLE links_chatpicmessage ();
Ich versuche zu füge eine Spalte hinzsender
zu links_chatpicmessage
das ist ein Fremdschlüssel zu einer anderen Tabelle namens auth_user
's id
Spalte.
Um dies zu erreichen, versuche ich Folgendes im Terminal:
ALTER TABLE links_chatpicmessage
ADD FOREIGN KEY (sender)
REFERENCES auth_user;
Aber das gibt mir einen Fehler:
FEHLER: Die in der Fremdschlüsseleinschränkung angegebene Spalte "Absender" ist nicht vorhanden
Wie behebe ich das?
So fügen Sie einer Spalte eine Einschränkung hinzu: Sie muss zuerst in der Tabelle vorhanden sein in Postgresql gibt es keinen Befehl, mit dem Sie gleichzeitig die Spalte und die Einschränkung hinzufügen können. Es müssen zwei separate Befehle sein. Sie können dies mit folgenden Befehlen tun:
Zuerst machen Sie als:
ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;
Ich benutze integer
als Typ, aber es sollte der gleiche Typ sein wie in der id
-Spalte von auth_user
Tabelle.
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);
Das ADD CONSTRAINT fk_someName
Teil dieses Befehls ist Benennung Ihre Einschränkung. Wenn Sie letztere also mit einem Tool dokumentieren müssen, das Ihr Modell erstellt, haben Sie eine benannte Einschränkung anstelle eines zufälligen Namens.
Außerdem dient es Administratorenzwecken, damit ein Datenbankadministrator weiß, dass die Einschränkung von dieser Tabelle stammt.
Normalerweise nennen wir es mit einem Hinweis darauf, woher es kommt und wo es auf Ihren Fall verweist. Es wäre fk_links_chatpicmessage_auth_user
Damit jeder, der diesen Namen sieht, genau weiß, um welche Einschränkung es sich handelt, muss keine komplexe Abfrage in der INFORMATION_SCHEMA durchgeführt werden, um dies herauszufinden.
EDIT
Wie in der Antwort von @ btubbs erwähnt, können Sie tatsächlich eine Spalte mit einer Einschränkung in einem Befehl hinzufügen. Wie so:
alter table links_chatpicmessage
add column sender integer,
add constraint fk_test
foreign key (sender)
references auth_user (id);
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".
Ich weiß, dass diese Antwort viel zu spät ist, und mir ist klar, dass dies dasselbe ist wie btubbs one-liner, nur ein bisschen 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);
Anmerkung: some_type = [Geben Sie dasselbe wie Absender in Tabelle auth_user ein.]
Die CONSTRAINT
-Klausel ist optional. Ich schlage vor, es wegzulassen und PostgreSQL die Einschränkung immer automatisch benennen zu lassen, ohne sie zu benennen, erhalten Sie einen logischen Namen
"links_chatpicmessage_sender_fkey" FOREIGN KEY (sender) REFERENCES auth_user(id)
Das ist es, was Sie wahrscheinlich wissen möchten, wenn ein INSERT
oder UPDATE
aufgrund einer Einschränkungsverletzung fehlschlägt.
All dies ist etwas dokumentiert auf ALTER TABLE
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 in derselben Tabelle ausgeben, indem Sie die beiden Anweisungen mit einem ,
Trennen.
-- 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);
**** Fremdschlüsselreferenz für vorhandene Spalte ****
ALTER TABLE table_name ADD CONSTRAINT fkey_name FOREIGN KEY (id) REFERENCES ref_table (id)