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?
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);
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".
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]
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.
Tous sont quelque peu documentés sur ALTER TABLE
_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 _,
_.
_-- 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);
_
**** 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)