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

标签 mysql sql database-design

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

前景(客户名称、汽车制造商、汽车型号、汽车年、carextcolour、cartrim、选项代码)

以上所有字段都带有下划线,表明它们是主要字段。所以有 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)
);

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

最佳答案

您应该创建一个外键约束来引用每个引用表的完整主键或唯一键。您无法为引用表主键中间的各个列创建单独的外键。

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

关于mysql - SQL 无法创建表(错误号 : 150),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58821452/

相关文章:

database-design - Doctrine 中的递归有多糟糕?

database-design - 如何存储历史数据

python - SqlAlchemy:如何在用户之间创建连接,即 make "friends"

javascript - 使用Angular的$http服务调用js文件?

python - 用于多条 SQL 行的 f 字符串

mysql - 如何从 rails 连接到 windows 中的 mysql

mysql - 如何在一个 select 语句中包含两个嵌套查询?

mysql - 如何编写查询以根据另一列设置列的值

mysql - 我可以使用从 SELECT 子句中的子查询返回的列对结果进行排序吗?

php - 使用 PHP 和 MySQL 的通知/新闻提要