Mysql
 sql >> Base de données >  >> RDS >> Mysql

Impossible d'ajouter une clé étrangère dans MySQL 5.7 (contrainte manquante dans la table référencée)

Il ressemble à productorder.oid fait partie d'une clé primaire à plusieurs colonnes, et ce n'est pas la colonne la plus à gauche de la clé primaire. (À l'avenir, veuillez inclure le résultat de SHOW CREATE TABLE <tablename> car il est plus clair que DESCRIBE sur des choses comme les clés multi-colonnes.)

Lorsque vous déclarez une clé étrangère, vous devez référencer la colonne la plus à gauche de la clé primaire.

Lorsque vous référencez une clé primaire à plusieurs colonnes, la clé étrangère doit avoir le même nombre de colonnes dans le même ordre.

Mauvais (pas assez de colonnes et référence à la deuxième colonne de la clé primaire) :

CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));

CREATE TABLE child  (y INT, FOREIGN KEY (y) REFERENCES parent(y));

Mauvais (les clés étrangères individuelles font chacune référence à une partie de la clé primaire composite) :

CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));

CREATE TABLE child  (x INT, y INT, 
  FOREIGN KEY (x) REFERENCES parent(x),
  FOREIGN KEY (y) REFERENCES parent(y)
);

À droite (mêmes colonnes) :

CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));

CREATE TABLE child  (x INT, y INT, FOREIGN KEY (x, y) REFERENCES parent(x, y));

Concernant votre commentaire :

Je pense maintenant que votre vrai problème est que vous avez inversé la relation. Vous essayez de déclarer une clé étrangère dans deliveryaddress faisant référence à productorder , mais je m'attendrais à ce que la référence aille dans l'autre sens.

ALTER TABLE productorder ADD FOREIGN KEY (oid) REFERENCES deliveryaddress (oid);

Alors vous n'avez pas d'erreur, car la clé primaire de deliveryaddress n'est qu'une colonne.

Je pense que cette relation a plus de sens dans une application de commerce électronique typique. De nombreuses commandes peuvent faire référence à la même adresse. La relation inverse n'est probablement pas ce que vous souhaitez, car cela n'a aucun sens que de nombreuses adresses référencent une seule commande de produit.