sql >> Database >  >> RDS >> Mysql

Kan externe sleutel niet toevoegen in MySQL 5.7 (ontbrekende beperking in de tabel waarnaar wordt verwezen)

Het lijkt op productorder.oid maakt deel uit van een primaire sleutel met meerdere kolommen en is niet de meest linkse kolom in de primaire sleutel. (Voeg in de toekomst het resultaat toe van SHOW CREATE TABLE <tablename> omdat het duidelijker is dan BESCHRIJVEN over zaken als toetsen met meerdere kolommen.)

Wanneer u een externe sleutel declareert, moet u verwijzen naar de meest linkse kolom van de primaire sleutel.

Wanneer u verwijst naar een primaire sleutel met meerdere kolommen, moet de externe sleutel hetzelfde aantal kolommen in dezelfde volgorde hebben.

Fout (niet genoeg kolommen, en verwijzend naar de tweede kolom van de primaire sleutel):

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

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

Fout (afzonderlijke externe sleutels verwijzen elk naar een deel van de samengestelde primaire sleutel):

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 (dezelfde kolommen):

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

Opnieuw uw opmerking:

Ik denk nu dat je echte probleem is dat de relatie omgekeerd is. U probeert een externe sleutel aan te geven in deliveryaddress verwijzend naar productorder , maar ik zou verwachten dat de verwijzing de andere kant op zou gaan.

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

Dan heb je geen fout, want de primaire sleutel van deliveryaddress is slechts één kolom.

Ik geloof dat deze relatie logischer is in een typische e-commercetoepassing. Er zijn veel bestellingen die naar hetzelfde adres kunnen verwijzen. De tegenovergestelde relatie is waarschijnlijk niet wat u wilt, omdat het voor veel adressen geen zin heeft om naar één enkele productbestelling te verwijzen.



  1. mySQL-query:hoe invoegen met UNION?

  2. Hoe het tegenovergestelde van BETWEEN te gebruiken in een MySQL-query?

  3. COUNT() versus COUNT_BIG() in SQL Server:wat is het verschil?

  4. Moet ik in PHP/MySQL meerdere databaseverbindingen openen of 1 delen?