2012-12-14 67 views
0

我必須創建包含所有這些組合鍵的表。SQL無法創建表(errno:150)

前景(CUSTNAME,carmake,carmodel,caryear,carextcolour,cartrim,optioncode)

上述的所有字段被下劃線,以顯示它們是伯。所以7個主要組合鍵。

由於某些原因,這不會創建表格。

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) REFERENCES car(Carmake), 
CONSTRAINT fk3prospect FOREIGN KEY (Carmodel) REFERENCES car(Carmodel), 
CONSTRAINT fk4prospect FOREIGN KEY (Caryear) REFERENCES car(Caryear), 
CONSTRAINT fk5prospect FOREIGN KEY (Carextcolour) REFERENCES car(Carextcolour), 
CONSTRAINT fk6prospect FOREIGN KEY (Cartrim) REFERENCES car(Cartrim), 
CONSTRAINT fk7prospect FOREIGN KEY (Optioncode) REFERENCES optiontable(Optioncode) 
); 

我正在使用的代碼來創建此表充滿組合鍵。

+0

我不知道mySQL,但在一些RDBMS中,不允許有一個複合主鍵,其中一個字段可以爲空;應該'選項代碼'是否'不爲空'?另外,您可以將FK參考文件合併到一輛車中。 –

+1

它對我來說運行良好。它創建了表格(我正在使用Mysql Workbench) – PCM

+0

@PCM你是怎麼做到的?你有「汽車」桌子的桌子定義嗎? –

回答

1

您的查詢之前只需添加此行)

SET foreign_key_checks = 0; 
0

你應該有一個外鍵約束引用每個引用表的主要或唯一鍵。您無法在引用表的主鍵中間爲單個列創建單獨的外鍵。

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

我用這個詞應該上面因爲InnoDB實際上比ANSI/ISO SQL標準更寬鬆一點,當涉及到外鍵。標準SQL表示外鍵的列必須是是引用的主鍵或唯一鍵的列的完整列表。

InnoDB允許您使用列的子集,只要它們是這些列的左前綴即可。但是你不應該那樣做,因爲當子行可能在其父表中引用多行行時,會得到非常令人困惑的結果。

相關問題