我正在向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”列,所以为什么要提及它?
任何输入表示赞赏。
答案 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)))