Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Fremdschlüssel kann in MySQL 5.7 nicht hinzugefügt werden (fehlende Einschränkung in der referenzierten Tabelle)

Es sieht aus wie productorder.oid ist Teil eines mehrspaltigen Primärschlüssels und nicht die Spalte ganz links im Primärschlüssel. (Fügen Sie in Zukunft bitte das Ergebnis von SHOW CREATE TABLE <tablename> ein weil es bei Dingen wie mehrspaltigen Schlüsseln klarer ist als DESCRIBE.)

Wenn Sie einen Fremdschlüssel deklarieren, müssen Sie auf die Spalte ganz links des Primärschlüssels verweisen.

Wenn Sie auf einen mehrspaltigen Primärschlüssel verweisen, muss der Fremdschlüssel die gleiche Anzahl von Spalten in der gleichen Reihenfolge haben.

Falsch (nicht genügend Spalten und Verweis auf die zweite Spalte des Primärschlüssels):

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

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

Falsch (einzelne Fremdschlüssel, die jeweils auf einen Teil des zusammengesetzten Primärschlüssels verweisen):

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

Rechts (gleiche Spalten):

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

Zu Ihrem Kommentar:

Ich denke jetzt, dass Ihr eigentliches Problem darin besteht, dass Sie die Beziehung umgekehrt haben. Sie versuchen, einen Fremdschlüssel in deliveryaddress zu deklarieren Verweis auf productorder , aber ich würde erwarten, dass der Verweis in die andere Richtung geht.

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

Dann hast du keinen Fehler, weil der Primärschlüssel von deliveryaddress ist nur eine Spalte.

Ich glaube, dass diese Beziehung in einer typischen E-Commerce-Anwendung sinnvoller ist. Es gibt viele Bestellungen, die möglicherweise auf dieselbe Adresse verweisen. Das umgekehrte Verhältnis ist wahrscheinlich nicht das, was Sie wollen, da es für viele Adressen keinen Sinn macht, auf eine einzelne Produktbestellung zu verweisen.