2016-02-27 24 views
28

Ich habe eine Postgresql-Tabelle namens links_chatpicmessage, wo ich versuche, eine Spalte, die ein Fremdschlüssel zu einer anderen Tabelle namens auth_user ist. Diese Spalte wird sender heißen.Hinzufügen von Fremdschlüssel Spalte zu Postgresql Tabelle

die oben Um das zu erreichen, ich bin die folgend auf Terminal versuchen:

ALTER TABLE links_chatpicmessage ADD FOREIGN KEY (sender) REFERENCES auth_user;

aber das gibt mir eine Fehlermeldung:

ERROR: column "sender" referenced in foreign key constraint does not exist

Wie kann ich dieses Problem beheben?

Antwort

42

So fügen Sie einer Spalte eine Einschränkung hinzu Es muss zuerst in der Tabelle vorhanden sein Es gibt keinen Befehl in Postgresql, den Sie verwenden können, der die Spalte hinzufügt und die Einschränkung gleichzeitig hinzufügt. Es müssen zwei separate Befehle sein. Sie können es folgende Befehle:

Erstes tun, wie:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER; 

Ich benutze integer als Typ hier, aber es sollte die gleiche Art der id Spalte der auth_user Tabelle sein.

Dann fügen Sie die Einschränkung

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 Ihre Constraint Benennung ist so, wenn Sie diese auf Notwendigkeit, es mit etwas Werkzeug zu dokumentieren, dass Ihr Modell schaffen Sie eine benannte Integritäts haben anstelle eines zufälligen Namens.

Auch es dient zu Zwecken der Administratoren, so dass ein DBA wissen, dass Constraint aus dieser Tabelle ist.

Normalerweise nennen wir es mit einem Hinweis darüber, woher es kam, wo es auf Ihrem Fall verweist fk_links_chatpicmessage_auth_user so dass jeder, der diesen Namen sieht, genau wissen, was diese Einschränkung ist, ohne komplexe Abfrage auf der INFORMATION_SCHEMA zu finden .

EDIT

Wie @ btubbs der genannten beantworten Sie tatsächlich eine Spalte mit einer Einschränkung in einem Befehl hinzufügen können. Wie so:

alter table links_chatpicmessage 
     add column sender integer, 
     add constraint fk_test 
     foreign key (sender) 
     references auth_user (id); 
+1

Hallo @HassanBaig Ich werde meinen Beitrag bearbeiten, um jeden Teil zu erklären. –

+0

Ich verstehe. +1 für die Erklärung. Lassen Sie mich es versuchen –

+0

So versuchte ich 'ALTER TABLE links-_chatpicmessage ADD CONSTRAINT fk_links_chatpicmessage_auth_user FREMDSCHLÜSSEL (Absender) REFERENZEN auth_user (id);' aber ich habe immer noch 'Spalte" Absender "in Fremdschlüssel-Einschränkung referenziert nicht existiert'. Ich vermisse etwas Grundlegendes, nehme ich an? –

27

Sie können dies auf eine Zeile in Postgres tun:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER REFERENCES auth_user (id); 

Sie müssen nicht manuell einen Namen setzen. Postgres nennt diese Einschränkung automatisch "links_chatpicmessage_auth_user_id_fkey".

4

Ich weiß, diese Antwort Art und Weise zu spät ist, und ich weiß, dies ist das gleiche wie btubbs Einzeiler, nur ein wenig aussagekräftiger ...

Vorausgesetzt, dass Sie den Primärschlüssel in der Tabelle auth_user verweisen möchten, und dass Schlüsselname ist "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 die gleiche wie Absender in Tabelle auth_user]

Verwandte Themen