MYSQL->外键-> Errorno 150

时间:2018-12-27 17:50:51

标签: mysql reference foreign-keys

我有以下问题。这些是我的表格:

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_lName和d_lName设置FOREIGN KEY时出现错误。

我不确定为什么会这样。

1 个答案:

答案 0 :(得分:0)

必须按引用的顺序对引用的字段进行索引,因为您自己是在引用Director.director_lname,所以它必须是Director表中索引的第一个字段。引用Author.author_lName时应该遇到类似的问题。

旁注:

  • 更常见的是为这些类型的表提供替代自动增量主键,并为引用这些主键的引用提供替代。
  • 为每个字段加上表名前缀将使以后的查询不必要地变长;如果不同表中的字段需要区分,则可以简单地通过指定表名(或查询中使用的较短别名)来完成。示例:SELECT d.fname FROM Director AS d
  • 如果保留当前设计,则fk参考将允许某些奇怪的行为。即使该组合不存在,它也允许Award引用一位董事的fname和另一位董事的lname。例如:“ Hayao Spielberg”