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.