首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL外键约束的格式不正确

MySQL外键约束的格式不正确
EN

Database Administration用户
提问于 2018-04-10 14:15:50
回答 5查看 93.4K关注 0票数 18

我有下表的定义:

代码语言:javascript
复制
CREATE TABLE `async_task` (
  `idasync_task` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `idasync_type` int(10) unsigned NOT NULL,
  `priority` tinyint(3) NOT NULL,
  `status` enum('todo','doing','failed') NOT NULL DEFAULT 'todo',
  `iduser` int(11) NOT NULL,
  `date_added` datetime NOT NULL,
  PRIMARY KEY (`idasync_task`),
  KEY `priority_id` (`priority`,`idasync_task`),
  KEY `status_type` (`status`,`idasync_type`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

我在我的notification表中添加了一列,我想指向async_task

代码语言:javascript
复制
ALTER TABLE `notification` ADD COLUMN `async_task_id` BIGINT(20)

当我添加以下外键时:

代码语言:javascript
复制
ALTER TABLE `notification` ADD CONSTRAINT `fk_notification_async_task` 
    FOREIGN KEY (`async_task_id`) REFERENCES `async_task`(`idasync_task`);

我得到:

代码语言:javascript
复制
ERROR 1005 (HY000): Can't create table `my_database`.`#sql-182_2d` 
(errno: 150 "Foreign key constraint is incorrectly formed")

我找过其他地方,但只发现错误是存在的:

  1. 没有创建要引用的表(不是情况)
  2. 您所引用的表不是InnoDB (情况并非如此,通知和async_task都是InnoDB)
  3. 您没有引用整个主键(不是这种情况,唯一的主键是ID列)。

还能是什么?

EN

回答 5

Database Administration用户

回答已采纳

发布于 2018-04-10 14:34:40

引用列和引用列都必须具有相同的类型(在本例中,相同的列包含unsigned属性)。

您没有将notification.async_task_id定义为无符号,因此它是用(默认) signed创建的。修正后,外键就不会产生错误。

票数 19
EN

Database Administration用户

发布于 2021-09-02 16:31:53

另外,这两个表的字符集可能不同。做一个“显示创建表table1”和“显示创建表table2”,并注意像默认CHARSET=utf8或默认CHARSET=utf8mb4这样的结尾,它们是不一样的,不能让FKs在它们之间进行指向。

票数 4
EN

Database Administration用户

发布于 2020-11-22 19:02:50

我也有同样的问题,我的问题是因为我试图引用的表还没有创建。如果您试图引用的表没有创建,它将返回此错误。先尝试创建引用表,然后再尝试。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/203509

复制
相关文章

相似问题

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