Det ligner productorder.oid
er en del af en primærnøgle med flere kolonner, og det er ikke kolonnen længst til venstre i primærnøglen. (I fremtiden bedes du inkludere resultatet af SHOW CREATE TABLE <tablename>
fordi det er mere klart end BESKRIV om ting som flerspaltenøgler.)
Når du erklærer en fremmednøgle, skal du henvise til kolonnen længst til venstre i den primære nøgle.
Når du refererer til en primærnøgle med flere kolonner, skal den fremmede nøgle have det samme antal kolonner i samme rækkefølge.
Forkert (ikke nok kolonner, og refererer til anden kolonne af primær nøgle):
CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));
CREATE TABLE child (y INT, FOREIGN KEY (y) REFERENCES parent(y));
Forkert (individuelle fremmednøgler, der hver refererer til en del af den sammensatte primærnøgle):
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)
);
Højre (samme kolonner):
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));
Om din kommentar:
Jeg tænker nu, at dit virkelige problem er, at du har vendt forholdet. Du forsøger at erklære en fremmednøgle i deliveryaddress
med henvisning til productorder
, men jeg forventer, at referencen går den anden vej.
ALTER TABLE productorder ADD FOREIGN KEY (oid) REFERENCES deliveryaddress (oid);
Så har du ingen fejl, fordi den primære nøgle til deliveryaddress
er kun én kolonne.
Jeg mener, at dette forhold giver mere mening i en typisk e-handelsapplikation. Der er mange ordrer, der kan referere til den samme adresse. Det modsatte forhold er sandsynligvis ikke, hvad du ønsker, for det giver ingen mening for mange adresser at henvise til en enkelt produktordre.