我有以下表定义:
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;
我在我的通知表中添加了一个列,我想指向async_task:
ALTER TABLE `notification` ADD COLUMN `async_task_id` BIGINT(20)
当我添加以下外键时:
ALTER TABLE `notification` ADD CONSTRAINT `fk_notification_async_task`
FOREIGN KEY (`async_task_id`) REFERENCES `async_task`(`idasync_task`);
我明白了:
ERROR 1005 (HY000): Can't create table `my_database`.`#sql-182_2d`
(errno: 150 "Foreign key constraint is incorrectly formed")
我看过其他地方,但只发现错误:
>您创建的表未创建(不是这种情况)
>您引用的表不是InnoDB(不是这种情况,通知和async_task都是InnoDB)
>您没有引用整个主键(不是这种情况,唯一的主键是ID列).
还有什么呢?
解决方法:
引用列和引用列的类型必须相同(在这种情况下,包括unsigned属性).
您没有将notification.async_task_id定义为unsigned,因此它是使用(默认)signed创建的.修复此问题,外键不会引发任何错误.
标签:mysql,mariadb,foreign-key
来源: https://codeday.me/bug/20190807/1605650.html