webentwicklung-frage-antwort-db.com.de

Das Hinzufügen einer Spalte als Fremdschlüssel führt dazu, dass eine FEHLER-Spalte, auf die in der Fremdschlüsseleinschränkung verwiesen wird, nicht vorhanden ist

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?

58
Hassan Baig

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);
92
Jorge Campos

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".

64
btubbs

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.]

7
Ted Spradley

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.

Syntax zum Hinzufügen eines Fremdschlüssels

All dies ist etwas dokumentiert auf 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 in derselben Tabelle ausgeben, indem Sie die beiden Anweisungen mit einem , 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);
3
Evan Carroll

**** Fremdschlüsselreferenz für vorhandene Spalte ****

ALTER TABLE table_name ADD CONSTRAINT fkey_name FOREIGN KEY (id) REFERENCES ref_table (id)

0
Jagadeesha N