sql >> Database >  >> RDS >> Mysql

SQL Kan geen tabel maken (errno:150)

U moet één externe sleutelbeperking maken die verwijst naar de volledige primaire of unieke sleutel van elke tabel waarnaar wordt verwezen. U kunt geen aparte externe sleutels maken voor afzonderlijke kolommen in het midden van de primaire sleutel van de referentietabel.

CREATE TABLE prospect
(Custname      VARCHAR(25) NOT NULL,
 Carmake       VARCHAR(25) NOT NULL,
 Carmodel      VARCHAR(20) NOT NULL,
 Caryear       VARCHAR(4) NOT NULL,
 Carextcolour  VARCHAR(10) NOT NULL,
 Cartrim       VARCHAR(10) NOT NULL,
 Optioncode    CHAR(4),
 CONSTRAINT pkprospect PRIMARY KEY (Custname, Carmake, Carmodel, Caryear, Carextcolour,           Cartrim, Optioncode),
 CONSTRAINT fkprospect FOREIGN KEY (Custname) REFERENCES customer(Custname),
 CONSTRAINT fk2prospect FOREIGN KEY (Carmake, Carmodel, Caryear, Carextcolour, Cartrim)
   REFERENCES car(Carmake, Carmodel, Caryear, Carextcolour, Cartrim),
 CONSTRAINT fk7prospect FOREIGN KEY (Optioncode) REFERENCES optiontable(Optioncode)
);

Ik gebruikte het woord moeten hierboven omdat InnoDB eigenlijk een beetje soepeler is dan de ANSI/ISO SQL-standaard als het gaat om externe sleutels. Standaard SQL zegt dat de kolommen van de refererende sleutel moeten de volledige lijst met kolommen zijn van de primaire of unieke sleutel waarnaar wordt verwezen.

InnoDB staat u toe om een ​​subset van kolommen te gebruiken, zolang ze maar een linker prefix van die kolommen zijn. Maar je moet dat niet doen, omdat je echt verwarrende resultaten krijgt wanneer een onderliggende rij kan verwijzen naar meerdere rijen in de bovenliggende tabel.



  1. Maven-afhankelijkheid instellen voor SQL Server

  2. Tel de resultaten van een paar zoekopdrachten op en vind dan de top 5 in SQL

  3. Hoe de serialisatiegegevens in MySQL bij te werken

  4. DbUpdateConcurrencyException met Entity Framework 6 met MySql