我正在向mySQL DB的表中的列添加外键:
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不是一个表,“orders”也不是数据库中任何现有表上的列,那么为什么要提到它呢?
感谢您提供的任何意见。
发布于 2020-02-12 06:38:07
错误引用了一个限定的表名,即您的模式名为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 existMyISAM表不支持外键约束。
遗憾的是,错误消息如此不明确。该表存在,但在InnoDB数据字典中不存在。我猜这就是他们的理由。
我在MySQL 5.7中没有看到同样的错误,我得到的结果是:
Query OK, 0 rows affected (0.02 sec)当您尝试在MySQL 5.7中的MyISAM表上创建外键时,该操作将被忽略。它不会导致任何错误,它只是不会这样做。
随着MySQL 8.0中InnoDB数据字典的新实现,他们最终抛出了一个错误,而不是默默地接受不受支持的特性的ALTER TABLE。
顺便说一下,我建议您不要再使用MyISAM表。它们正逐渐被淘汰。
发布于 2020-02-13 04:28:40
我忘了在被引用的表中设置主键,现在解决了这个问题:
create table proj (projno numeric(3,0) not null, pname char(5), budget numeric (7,2, PRIMARY KEY (projno)))https://stackoverflow.com/questions/60178320
复制相似问题