Měli byste vytvořit jedno omezení cizího klíče odkazující na úplné primární nebo jedinečný klíč každé odkazované tabulky. Nemůžete vytvořit samostatné cizí klíče pro jednotlivé sloupce uprostřed primárního klíče tabulky odkazů.
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)
);
Použil jsem slovo měl bych výše, protože InnoDB je ve skutečnosti o něco shovívavější než standard ANSI/ISO SQL, pokud jde o cizí klíče. Standardní SQL říká, že sloupce cizího klíče musí být úplný seznam sloupců odkazovaného primárního nebo jedinečného klíče.
InnoDB vám umožňuje používat podmnožinu sloupců, pokud jsou levou předponou těchto sloupců. Ale neměli byste to dělat, protože pokud podřízený řádek může odkazovat na více, získáte opravdu matoucí výsledky řádků v nadřazené tabulce.