J'ai les tableaux suivants,
CREATE TABLE users (id int PRIMARY KEY);
-- already exists with data
CREATE TABLE message ();
Comment puis-je modifier la messages
table de telle sorte que,
- une nouvelle colonne appelée y
sender
est ajoutée - où
sender
est une clé étrangère référençant lausers
table
Ça n'a pas marché
# ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users;
ERROR: column "sender" referenced in foreign key constraint does not exist
Cette instruction ne crée-t-elle pas également la colonne?
postgresql
foreign-key
alter-table
Hassan Baig
la source
la source
Réponses:
Ce qui est relativement facile - il vous suffit d'ajouter une autre étape.
La
FOREIGN KEY
colonne doit exister pour en faire unFK
. J'ai fait ce qui suit (à partir d' ici et de la documentation ):Quelques points à noter:
TOUJOURS donner à vos clés étrangères des noms significatifs. Le fait que la clé "SYS_C00308108" soit violée n'est pas très utile. Voir le violon ici pour le comportement d'Oracle dans ces circonstances, le nom de la clé variera d'un violon à un violon, mais est une chaîne arbitraire commençant par SYS _...)
Compte tenu de votre déclaration:
Ce serait "agréable à avoir" si le SGBDR pouvait créer automatiquement le champ souhaité avec le type de données correspondant au champ référencé. Tout ce que je dirais, c'est que changer DDL est (ou du moins devrait être) une opération rarement utilisée et non quelque chose que vous voudriez faire régulièrement. Cela risque également de s'ajouter à une documentation déjà assez importante.
Au moins, PostgreSQL essaie de faire quelque chose de raisonnable - il concatène le nom de la table, le nom du
FOREIGN KEY
champ_fkey
et ajoute mêmeDETAIL: Key (sender_id)=(56) is not present in table "user_".
pour donner quelque chose qui pourrait avoir du sens pour un être humain - voir violon ici .la source
"y_z_fkey"
. Je dirais que c'est un meilleur nom quey_x_fkey
parce que votre violation ne vous indique pas la colonne dans laquelle vous insérez à l'origine de l'erreur. Je me soucie moins de l'endroit où ça pointe. En règle générale, vous ne devez JAMAIS nommer vos fkeys et laisser la valeur par défaut de PostgreSQL le gérer.ON UPDATE CASCADE ON DELETE CASCADE;
un exemple, en particulier sans raison. Cela rend l'exemple plus complexe et vous n'avez pas la peine d'expliquer ce que c'est. Pour ma part, je ne veux normalement pas que les suppressions se mettent en cascade.y_x_fkey
ouy_z_fkey
oux__y_FK
, tant qu'il est cohérent.Je ne sais pas pourquoi tout le monde vous dit que vous devez le faire en deux étapes. En fait, non . Vous avez essayé d'ajouter un
FOREIGN KEY
qui suppose, par conception, que la colonne est là et renvoie cette erreur si la colonne n'est pas là. Si vous ajoutez leCOLUMN
, vous pouvez explicitement en faire unFOREIGN KEY
lors de la création avecREFERENCES
,Fonctionnera bien. Vous pouvez voir la syntaxe d'
ALTER TABLE
ici,Avec "action" comme,
Ces exemples sont même dans les documents,
Mais tout cela n'est pas nécessaire car nous pouvons compter sur le nom automatique et la résolution de la clé primaire (si seul le nom de la table est spécifié, vous faites référence à la clé primaire).
la source
CAS1: Si vous devez créer une clé étrangère lors de la création d'une nouvelle table
Les commandes ci-dessus créeront une table avec le nom 'table1' et trois colonnes nommées 'id' (clé primaire), 'colonne1', 'table2_id' (clé étrangère de table1 qui fait référence à la colonne id de table2).
DATATYPE 'serial' créera la colonne qui utilise ce type de données comme colonne générée automatiquement, lorsque vous insérez des valeurs dans le tableau, vous n'avez pas besoin de mentionner cette colonne du tout, ou vous pouvez donner 'default' sans guillemets à la place de la valeur.
Une colonne de clé primaire est toujours ajoutée à l'index de la table avec la valeur 'tablename_pkey'.
Si une clé étrangère est ajoutée au moment de la création de la table, une CONTRAINTE est ajoutée avec le modèle '(present_table_name) _ (foreign_key_id_name) _fkey'.
Lors de l'ajout d'une clé étrangère, nous devons saisir le mot-clé 'REFERENCES' à côté du nom de la colonne car nous voulons dire aux postgres que cette colonne fait référence à une table puis à côté des références, nous devons donner la table pour référence et entre parenthèses donner la nom de colonne de la table référencée, généralement les clés étrangères sont données comme colonnes de clé primaire.
CAS 2: Si vous voulez une clé étrangère vers une table existante sur une colonne existante
REMARQUE: les crochets '()' après FOREIGN KEY et REFERENCES tabel2 sont obligatoires, sinon postgres générera une erreur.
la source
Je connais le problème. Les noms des colonnes sont différents. Peut-être que dans une colonne, il y a un espace ajouté après le nom de votre colonne, alors assurez-vous soigneusement que les noms de vos colonnes ont été nommés exactement de la même manière.
la source