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


J'ai la configuration suivante,

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

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

Pour réaliser ce qui précède, j'essaie le terminal suivant:

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 ne   exister

Comment puis-je réparer ça?


40
2018-02-27 22:18


origine


Réponses:


Pour ajouter une contrainte à une colonne Il doit exister 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. Ce doit être deux commandes distinctes. Vous pouvez le faire en utilisant les commandes suivantes:

Faites d'abord comme:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;

j'utilise integer comme type ici, mais il devrait être du même type que le id colonne de la auth_user table.

Ensuite, vous ajoutez la contrainte

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

le ADD CONSTRAINT fk_someName une partie de cette commande est appellation votre contrainte donc si vous avez besoin de le documenter avec un outil qui crée votre modèle, vous aurez une contrainte nommée au lieu d'un nom aléatoire.

Il sert également à des fins d'administrateurs pour qu'un administrateur de base de données sache que la contrainte provient de cette table.

Habituellement, nous le nommons avec des indications sur l’endroit où il a été fait référence à votre cas. fk_links_chatpicmessage_auth_user Ainsi, toute personne qui voit ce nom saura exactement quelle est cette contrainte sans requête complexe sur INFORMATION_SCHEMA pour le savoir.

MODIFIER

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);

60
2018-02-27 22:24



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


41
2018-01-04 17:22



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

En supposant que vous voulez référencer la clé primaire dans la table auth_user et que ce nom de 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]


6
2018-04-20 21:17



le CONSTRAINT La clause est facultative. Je suggère de l’engager et de toujours laisser PostgreSQL appeler automatiquement la contrainte, sans la 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 un INSERT ou UPDATE échoue en raison d'une violation de contrainte.

Syntaxe pour ajouter une clé étrangère

Tous ces éléments 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);

Ceci est composé et transnational. Vous pouvez émettre deux ALTER déclarations sur la même table en séparant les deux déclarations avec un ,.

Vers 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);

1
2018-06-04 13:39