Mysql
 sql >> Database >  >> RDS >> Mysql

SQL Impossibile creare la tabella (errno:150)

Dovresti creare un vincolo di chiave esterna che faccia riferimento al completo chiave primaria o univoca di ogni tabella di riferimento. Non puoi creare chiavi esterne separate per singole colonne nel mezzo della chiave primaria della tabella dei riferimenti.

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

Ho usato la parola dovrei sopra perché InnoDB è in realtà un po' più indulgente rispetto allo standard ANSI/ISO SQL quando si tratta di chiavi esterne. L'SQL standard dice che le colonne della chiave esterna devono essere l'elenco completo delle colonne della chiave primaria o univoca di riferimento.

InnoDB ti consente di utilizzare un sottoinsieme di colonne, purché siano un prefisso sinistro di quelle colonne. Ma non dovresti farlo, perché ottieni risultati davvero confusi quando una riga figlio può fare riferimento a più righe nella sua tabella padre.