首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将外键添加到现有表时出现表不存在错误

问将外键添加到现有表时出现表不存在错误
EN

Stack Overflow用户
提问于 2020-02-12 06:27:12
回答 2查看 685关注 0票数 0

我正在向mySQL DB的表中的列添加外键:

代码语言:javascript
复制
 ALTER TABLE Orders ADD CONSTRAINT FK_ProjectNumber FOREIGN KEY (porj) REFERENCES proj(projno);

包含现有列的表是emp,emp中的列是porj,外键驻留在表proj中,列projno。然而,我得到了以下错误:

代码语言:javascript
复制
1146 - Table 'empdept.orders' doesn't exist

我不理解对empdept.orders的引用,empdept不是一个表,“orders”也不是数据库中任何现有表上的列,那么为什么要提到它呢?

感谢您提供的任何意见。

EN

回答 2

Stack Overflow用户

发布于 2020-02-12 06:38:07

错误引用了一个限定的表名,即您的模式名为emptdept,表名为Orders。

如果表Orders为MyISAM (我假设是InnoDB以外的任何值),我可以在MySQL 8.0上重现此错误。

代码语言:javascript
复制
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中没有看到同样的错误,我得到的结果是:

代码语言:javascript
复制
Query OK, 0 rows affected (0.02 sec)

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

随着MySQL 8.0中InnoDB数据字典的新实现,他们最终抛出了一个错误,而不是默默地接受不受支持的特性的ALTER TABLE。

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

票数 3
EN

Stack Overflow用户

发布于 2020-02-13 04:28:40

我忘了在被引用的表中设置主键,现在解决了这个问题:

代码语言:javascript
复制
create table proj (projno numeric(3,0) not null, pname char(5), budget numeric (7,2, PRIMARY KEY (projno)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60178320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档