Mysql

MySQL FOREIGN KEY 約束的格式不正確

  • February 10, 2022

我有以下表定義:

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

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")

我在別處看過,但只發現錯誤是:

  1. 您引用的表未創建(不是這種情況)
  2. 您引用的表不是 InnoDB(不是這種情況,notification 和 async_task 都是 InnoDB)
  3. 您沒有引用整個主鍵(不是這種情況,唯一的主鍵是 ID 列)。

還能是什麼?

引用列和被引用列都必須是相同類型(在這種情況下相同包括unsigned屬性)。

您沒有定義notification.async_task_id為無符號,因此它是使用 (default) 創建的signed。修復它,外鍵不會引發錯誤。

我有同樣的問題,我的問題是因為我試圖引用的表尚未創建。如果未創建您嘗試引用的表,它將返回此錯誤。先嘗試創建參考表,然後再試一次。

引用自:https://dba.stackexchange.com/questions/203509