这个问题在这里已经有答案了:
mysql创建带有外键的表,给出errno:150(20个答案)
两年前关门了。
我有以下问题。这些是我的table:
CREATE TABLE Author
(
author_fName VARCHAR(256) NOT NULL,
author_lName VARCHAR(256) NOT NULL,
author_dob DATE,
PRIMARY KEY (author_fName, author_lName)
# author_age INT
);
CREATE TABLE Director
(
director_fName VARCHAR(256) NOT NULL,
director_lName VARCHAR(256) NOT NULL,
director_dob DATE,
PRIMARY KEY (director_fName, director_lName)
);
CREATE TABLE Award
(
award_Name VARCHAR(256) NOT NULL PRIMARY KEY,
a_fName VARCHAR(256),
a_lName VARCHAR(256),
d_fName VARCHAR(256),
d_lName VARCHAR(256),
FOREIGN KEY (a_fName) REFERENCES Author(author_fName),
FOREIGN KEY (a_lName) REFERENCES Author(author_lName),
FOREIGN KEY (d_fName) REFERENCES Director(director_fName),
FOREIGN KEY (d_lName) REFERENCES Director(director_lName)
);
遗憾的是,当我试图创建最后一个表时,我收到了一个可爱的错误150。我稍微调查了一下,发现当我尝试为a\u lname和d\u lname设置外键时会出现错误。
我不知道为什么会这样。
1条答案
按热度按时间idfiyjo81#
引用的字段必须按引用的顺序编制索引,因为您正在引用
Director.director_lname
它本身必须是Director
table。你应该有类似的问题与参考Author.author_lName
.旁注:
对于这类表,更典型的是使用代理自动递增主键,而对于引用,则使用代理自动递增主键来引用这些主键。
在每个字段前面加上表名会使将来的查询变得不必要的长;如果需要区分来自不同表的字段,只需指定表的名称(或查询中使用的较短别名)即可。例子:
SELECT d.fname FROM Director AS d
如果保持当前设计,fk引用将允许一些奇怪的行为。它允许Award
引用fname
一名董事,以及lname
即使这个组合不存在。例如:“哈药·斯皮尔伯格”