SQL无法创建表(错误号:150)

时间:2012-12-14 00:45:33

标签: mysql sql database-design

我必须使用所有这些复合键创建此表。

潜在客户(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)
);

我用来创建这个充满复合键的表的代码。

4 个答案:

答案 0 :(得分:1)

只需在查询之前添加此行;)

SET foreign_key_checks = 0;

答案 1 :(得分: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允许您使用列的子集,只要它们是这些列的左前缀即可。但是你不应该这样做,因为当子行可以在其父表中引用多个行时,你会得到非常令人困惑的结果。

答案 2 :(得分:0)

试试这个:第一步用主键创建表,然后对外键使用alter table命令并添加它们。

答案 3 :(得分:0)

如果您尚未创建参考表,则无法创建此表。您可以先创建所有参考表,然后使用 alter table 输入 FK 提交。

相关问题