sql >> Databasteknik >  >> RDS >> Mysql

Det går inte att lägga till främmande nyckel i MySQL 5.7 (Saknar begränsning i den refererade tabellen)

Det ser ut som productorder.oid är en del av en primärnyckel med flera kolumner, och det är inte kolumnen längst till vänster i primärnyckeln. (Inkludera i framtiden resultatet av VISA SKAPA TABELL eftersom det är mer tydligt än BESKRIV om saker som nycklar med flera kolumner.)

När du deklarerar en främmande nyckel måste du referera till kolumnen längst till vänster i primärnyckeln.

När du refererar till en primärnyckel med flera kolumner måste den främmande nyckeln ha samma antal kolumner i samma ordning.

Fel (inte tillräckligt med kolumner och hänvisar till den andra kolumnen i primärnyckeln):

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

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

Fel (individuella främmande nycklar som varje hänvisar till del av den sammansatta primärnyckeln):

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öger (samma kolumner):

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

Angående din kommentar:

Jag tänker nu att ditt verkliga problem är att du har förhållandet omvänt. Du försöker deklarera en främmande nyckel i leveransadress hänvisar till produktorder , men jag förväntar mig att referensen går åt andra hållet.

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

Då har du inget fel, eftersom primärnyckeln för leveransadress är bara en kolumn.

Jag tror att detta förhållande är mer vettigt i en typisk e-handelsapplikation. Det finns många beställningar som kan referera till samma adress. Det motsatta förhållandet är förmodligen inte vad du vill, eftersom det är meningslöst för många adresser att referera till en enda produktorder.



  1. Optimera while och SQL i varje

  2. Hur parallella planer startar – del 5

  3. finns det något sätt att logga alla misslyckade SQL-satser i Oracle 10g

  4. Stäng MySQL-anslutning (PHP)