Mysql
 sql >> Database >  >> RDS >> Mysql

Impossibile aggiungere la chiave esterna in MySQL 5.7 (vincolo mancante nella tabella di riferimento)

Sembra productorder.oid fa parte di una chiave primaria a più colonne e non è la colonna più a sinistra della chiave primaria. (In futuro, includi il risultato di SHOW CREATE TABLE <tablename> perché è più chiaro di DESCRIBE su cose come le chiavi a più colonne.)

Quando dichiari una chiave esterna, devi fare riferimento alla colonna più a sinistra della chiave primaria.

Quando si fa riferimento a una chiave primaria a più colonne, la chiave esterna deve avere lo stesso numero di colonne nello stesso ordine.

Sbagliato (colonne insufficienti e riferimento alla seconda colonna della chiave primaria):

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

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

Sbagliato (singole chiavi esterne a ciascuna parte della chiave primaria composta):

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

Destra (stesse colonne):

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

Re il tuo commento:

Ora sto pensando che il tuo vero problema è che hai la relazione invertita. Stai cercando di dichiarare una chiave esterna in deliveryaddress facendo riferimento a productorder , ma mi aspetto che il riferimento vada nella direzione opposta.

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

Quindi non hai errori, perché la chiave primaria di deliveryaddress è solo una colonna.

Credo che questa relazione abbia più senso in una tipica applicazione di e-commerce. Ci sono molti ordini che potrebbero fare riferimento allo stesso indirizzo. Probabilmente la relazione opposta non è quella che desideri, perché non ha senso che molti indirizzi facciano riferimento a un singolo ordine di prodotto.