web-dev-qa-db-fra.com

L'ajout d'une colonne en tant que clé étrangère donne à ERROR la ​​colonne référencée dans la clé étrangère, la contrainte n'existe pas

J'ai le suivant mis en place,

CREATE TABLE auth_user ( id int PRIMARY KEY );
CREATE TABLE links_chatpicmessage ();

J'essaie de ajouter une colonne nommé sender à links_chatpicmessage qui est une clé étrangère vers une autre table appelée auth_user 's id colonne.

Pour atteindre ce qui précède, j'essaie ce qui suit sur le terminal:

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

Mais cela me donne une erreur:

ERREUR: la colonne "expéditeur" référencée dans la contrainte de clé étrangère n'existe pas

Comment puis-je réparer ça?

58
Hassan Baig

Pour ajouter une contrainte à une colonne, il faut qu'elle existe d'abord dans la table. il n'y a pas de commande dans PostgreSQL que vous pouvez utiliser pour ajouter la colonne et ajouter la contrainte en même temps. Il doit s'agir de deux commandes distinctes. Vous pouvez le faire en utilisant les commandes suivantes:

D'abord faire comme:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;

J'utilise integer comme type ici, mais il devrait s'agir du même type que la colonne id de la table auth_user.

Ensuite, vous ajoutez la contrainte

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

La partie ADD CONSTRAINT fk_someName de cette commande est nommer votre contrainte. Par conséquent, si vous devez la documenter avec un outil qui crée votre modèle, vous aurez une contrainte nommée au lieu d'un nom aléatoire.

De plus, il sert aux administrateurs afin qu'un administrateur de base de données sache que cette contrainte provient de cette table.

Habituellement, nous la nommons avec un indice sur son origine, et sur son cas, il s'agirait de fk_links_chatpicmessage_auth_user afin que quiconque voit ce nom sache exactement en quoi consiste cette contrainte sans faire une requête complexe sur le INFORMATION_SCHEMA pour le savoir. .

EDIT

Comme mentionné dans la réponse de @ btubbs, vous pouvez réellement ajouter une colonne avec une contrainte dans une commande. Ainsi:

alter table links_chatpicmessage 
      add column sender integer, 
      add constraint fk_test 
      foreign key (sender) 
      references auth_user (id);
92
Jorge Campos

Vous pouvez le faire dans Postgres sur une seule ligne:

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

Vous n'avez pas besoin de définir manuellement un nom. Postgres nommera automatiquement cette contrainte "links_chatpicmessage_auth_user_id_fkey".

64
btubbs

Je sais que cette réponse est très tardive et je réalise que c'est la même chose que btubbs one-liner, juste un peu plus descriptif ...

En supposant que vous souhaitiez référencer la clé primaire dans la table auth_user et que le nom de cette clé est 'id'.

J'utilise cette syntaxe:

ALTER TABLE links_chatpicmessage 
ADD COLUMN sender some_type,
ADD FOREIGN KEY (sender) REFERENCES auth_user(id);

Remarque: some_type = [tapez le même que l'expéditeur dans la table auth_user]

7
Ted Spradley

La clause CONSTRAINT est optionnelle. Je suggère de l'omettre et de laisser toujours PostgreSQL autoname la contrainte, sans le nommer vous obtiendrez un nom logique

_"links_chatpicmessage_sender_fkey" FOREIGN KEY (sender) REFERENCES auth_user(id)
_

C’est ce que vous voudrez probablement savoir si une INSERT ou UPDATE échoue en raison d’une violation de contrainte.

Syntaxe pour ajouter une clé étrangère

Tous sont quelque peu documentés sur ALTER TABLE

Vers une nouvelle colonne

_ALTER TABLE links_chatpicmessage 
  ADD COLUMN sender int,
  ADD [CONSTRAINT foo] FOREIGN KEY (sender) REFERENCES auth_user(id);
_

C'est composé et transactionnel. Vous pouvez émettre deux instructions ALTER sur la même table en les séparant par un _,_.

À une colonne préexistante

_-- 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

**** Référence de clé étrangère pour la colonne existante ****

ALTER TABLE nom_table ADD CONSTRAINT nom_fichier TOUCHE FOREIGN (id) REFERENCES ref_table (id)

0
Jagadeesha N