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.