web-dev-qa-db-ja.com

MySQL FOREIGN KEY制約が正しく形成されていません

次のテーブル定義があります。

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を指す列をnotificationテーブルに追加しました:

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列のみです)。

他に何ができるでしょうか?

5
Daniel Gray

参照列と参照列の両方が同じタイプである必要があります(この場合、unsigned属性も含まれます)。

notification.async_task_idを符号なしとして定義しなかったため、(デフォルト)signedを使用して作成されました。これを修正すると、外部キーはエラーを発生させません。

10
ypercubeᵀᴹ