SQL 无法创建表 (errno: 150)
Posted
技术标签:
【中文标题】SQL 无法创建表 (errno: 150)【英文标题】:SQL Can't create table (errno: 150) 【发布时间】:2012-12-14 00:45:32 【问题描述】:我必须用所有这些复合键创建这个表。
prospect(custname, carmake, carmodel, caryear, carextcolour, carrim, 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)
);
我用来创建这个充满复合键的表的代码。
【问题讨论】:
我不了解 mysql,但在某些 RDBMS 中,不允许您拥有其中一个字段可以为空的复合主键;Optioncode
也应该“不为空”吗?此外,您还可以将 FK 对 car 的引用合并为一个。
它对我来说运行良好。它创建了表(我使用的是 Mysql Workbench)
@PCM 你是怎么做到的?你有car
表的表定义吗?
为什么需要复合外键?您应该只有一个字段可供参考。至于汽车,您最好创建一个自动增量列作为 PK,并为您想要的列添加唯一索引。
【参考方案1】:
您应该创建一个外键约束来引用每个被引用表的完整主键或唯一键。您不能为引用表主键中间的各个列创建单独的外键。
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】:试试这个:第一步用主键创建表,然后对外键使用alter table命令并添加它们。
【讨论】:
【参考方案3】:如果您尚未创建参考表,则无法创建此表。您可以先创建所有参考表,然后使用 alter table 输入 FK 提交。
【讨论】:
以上是关于SQL 无法创建表 (errno: 150)的主要内容,如果未能解决你的问题,请参考以下文章
MySQL“错误 1005 (HY000): 无法创建表 'foo.#sql-12c_4' (errno: 150)”
一般错误:1005 无法创建表 errno:150“外键约束格式不正确”)