【问题标题】:Database Foreign Key Error数据库外键错误
【发布时间】:2014-10-22 22:23:33
【问题描述】:

我在使用 2 张桌子时遇到问题。

我刚刚使用以下 SQL 代码创建了一个名为“ejemplar”的表:

CREATE TABLE ejemplar 
(
id_revista INT NOT NULL,
id_ejemplar INT NOT NULL,
id_art  INT NOT NULL,
fecha_ejem VARCHAR (30),
precio_ejem decimal,
num_pag_ejem INT,
PRIMARY KEY (id_revista,id_ejemplar,id_art),
FOREIGN KEY (id_revista) REFERENCES revista (id_rev)
)

我想使用以下 SQL 代码创建一个名为“ejem_art”的表:

CREATE TABLE ejem_art(
id_rev INT NOT NULL,
id_ejem INT NOT NULL,
id_art INT NOT NULL,
num_pag INT,
PRIMARY KEY (id_rev,id_ejem,id_art),
FOREIGN KEY (id_rev) REFERENCES revista (id_rev),
FOREIGN KEY (id_ejem) REFERENCES ejemplar (id_ejemplar),
FOREIGN KEY (id_art) REFERENCES articulo (id_art)
);

DBMS 是 MySQL,如您所见,我在两个表的 PK 和 FK 字段中都有相同类型的数据。

当我在创建表“ejemplar”后尝试运行第二个 SQL 代码时,MySQL 显示了著名的 errno: 150,它与不同类型的数据甚至不同的引擎而不是 InnoDB 相关。

我已确保两件事都正确(相同的数据类型和相同的引擎),但我仍然无法运行第二个代码。

希望您能帮我解决这个问题,因为我不想仅仅因为这个错误而制作“Alter Table”。

提前致谢!

【问题讨论】:

  • 你检查过其他外键吗?确保问题不是来自另一个键。
  • 如果你重新创建一个被删除的表,它必须有一个符合引用它的外键约束的定义。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。如果这些不满足,MySQL 返回错误号 1005 并在错误消息中引用错误 150。我没有在引用的键上看到索引。
  • 是的。其他FK都不错。问题仅在于这两个表
  • 我之前的帖子是关于这个答案的:stackoverflow.com/questions/825362/mysql-error-150-foreign-keys
  • 很抱歉,我该怎么办?正如你所看到的,我首先创建了表“ejemplar”,然后创建了表“ejem_art”。再次感谢!

标签: mysql database


【解决方案1】:

您在外键中引用的列必须是父表的键中的最左列。

CREATE TABLE parent ( A INT, B INT, PRIMARY KEY (A,B) );

CREATE TABLE child (B INT, FOREIGN KEY (B) REFERENCES parent(B) ); /* WRONG */

CREATE TABLE child (A INT, FOREIGN KEY (A) REFERENCES parent(A) ); /* RIGHT */

你的cmets:

在表中定义列的顺序无关紧要。在 PRIMARY KEY 约束中列出列的顺序很重要。外键只能引用父键的最左列。

在你的父表中,你有这个主键:

PRIMARY KEY (id_revista,id_ejemplar),

id_revista 列位于最左侧。 id_ejemplar不在最左边

因此子表的外键不能这样做:

FOREIGN KEY (id_ejem) REFERENCES ejemplar (id_ejemplar), /* WRONG */

最好的解决方案是同时引用 id_revista 和 id_ejemplar。然后,您将引用父主键的一组列,从最左边开始。

FOREIGN KEY (id_rev, id_ejem) REFERENCES ejemplar (id_revista, id_ejemplar),

【讨论】:

  • 这是什么意思?对不起,我不明白你想说什么
  • 我添加了一个例子。你能刷新一下,看看是否更清楚?
  • 我尝试了以下 FOREIGN KEY (id_rev) REFERENCES revista (id_rev), FOREIGN KEY (id_ejem) REFERENCES ejemplar(id_ejem), FOREIGN KEY (id_art) REFERENCES articulo (id_art) 和 PK 在父表的顺序是:id_revista INT NOT NULL,id_ejemplar INT NOT NULL,id_art INT NOT NULL,我仍然无法使其工作
  • 是的,我看到有三个 FK。您应该让 FK 引用来自 ejemplar 的 整个 PK。
  • 不是每个 FK 都应该链接到三个表中的每一个吗?或者这种方式是链接它们的正确方法: FOREIGN KEY (id_rev, id_ejem,id_art) REFERENCES ejemplar (id_revista, id_ejemplar,id_art)
猜你喜欢
  • 2014-06-09
  • 2015-03-02
  • 1970-01-01
  • 2012-07-21
  • 2014-03-30
  • 2015-03-17
  • 2017-08-11
  • 2019-06-05
  • 2021-07-03
相关资源
最近更新 更多