将外键添加到现有表中时,表不存在错误

时间:2020-02-11 22:27:11

标签: mysql sql foreign-keys

我正在向MySQL数据库中表中的列添加外键:

 ALTER TABLE Orders ADD CONSTRAINT FK_ProjectNumber FOREIGN KEY (porj) REFERENCES proj(projno);

具有现有列的表为emp,emp中的列为porj,外键位于表proj的列projno中。但是我收到以下错误:

1146 - Table 'empdept.orders' doesn't exist

我不理解对empdept.orders的引用,empdept不是表,也不是DB中任何现有表上的“ orders”列,所以为什么要提及它?

任何输入表示赞赏。

2 个答案:

答案 0 :(得分:3)

该错误引用了合格的表名,即您的架构名称为emptdept,表名为Orders

如果表Orders是MyISAM(我认为是InnoDB或其他任何东西),我可以在MySQL 8.0上重现此错误。

mysql> CREATE TABLE `proj` (
    ->   `projno` int(11) NOT NULL,
    ->   PRIMARY KEY (`projno`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
mysql> CREATE TABLE `orders` (
    ->   `porj` int(11) DEFAULT NULL
    -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

mysql> ALTER TABLE Orders ADD CONSTRAINT FK_ProjectNumber FOREIGN KEY (porj) REFERENCES proj(projno);
ERROR 1146 (42S02): Table 'test.Orders' doesn't exist

MyISAM表不支持外键约束。

很遗憾错误消息如此不清楚。该表存在,但在InnoDB数据字典中不存在。我想这就是他们的理由。

我在MySQL 5.7中没有看到相同的错误,而是得到了以下结果:

Query OK, 0 rows affected (0.02 sec)

当您尝试在MySQL 5.7的MyISAM表上创建外键时,该操作将被静默忽略。它不会导致任何错误,只是不会发生。

借助MySQL 8.0中InnoDB数据字典的新实现,他们最终抛出了错误,而不是默默地接受ALTER TABLE作为不受支持的功能。

顺便说一句,我建议您不再使用MyISAM表。它们正逐渐被淘汰。

答案 1 :(得分:0)

我忘了在引用表中设置主键,现在已解决:

create table proj (projno numeric(3,0) not null, pname char(5), budget numeric (7,2, PRIMARY KEY (projno)))