mysql->外键->errorno 150

ki0zmccv  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(360)

这个问题在这里已经有答案了

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设置外键时会出现错误。
我不知道为什么会这样。

idfiyjo8

idfiyjo81#

引用的字段必须按引用的顺序编制索引,因为您正在引用 Director.director_lname 它本身必须是 Director table。你应该有类似的问题与参考 Author.author_lName .
旁注:
对于这类表,更典型的是使用代理自动递增主键,而对于引用,则使用代理自动递增主键来引用这些主键。
在每个字段前面加上表名会使将来的查询变得不必要的长;如果需要区分来自不同表的字段,只需指定表的名称(或查询中使用的较短别名)即可。例子: SELECT d.fname FROM Director AS d 如果保持当前设计,fk引用将允许一些奇怪的行为。它允许 Award 引用 fname 一名董事,以及 lname 即使这个组合不存在。例如:“哈药·斯皮尔伯格”

相关问题