mysql> ALTER TABLE category ADD CONSTRAINT category_parent_category_id FOREIGN KEY (parent) REFERENCES category(id);
ERROR 1005 (HY000): Can't create table 'sfnews.#sql-244_1' (errno: 150)
DDL следующим образом:
Create Table: CREATE TABLE `category` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`parent` bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `parent_idx` (`parent`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Почему это неправильно?
Самостоятельная ссылка должна быть возможна. Это потому, что "parent" - беззнаковый, а "id" - нет. Измените столбец id определения таблицы на
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
и все заработает.
В справочнике говорится о внешних ключах: "Размер и знак целочисленных типов должны быть одинаковыми"
Похоже, это та же проблема, что описана здесь
Если вы проверите состояние механизма InnoDB ( ПОКАЗАТЬ СОСТОЯНИЕ InnoDB
), вы получите более полное объяснение:
ПОСЛЕДНЯЯ ОШИБКА ИНОСТРАННОГО КЛЮЧА
{{ 1}}[...]
Невозможно найти индекс в указанной таблице, где указанные столбцы отображаются как первые столбцы, или типы столбцов в таблице и указанной таблице не соответствуют ограничению.
Сделать id
беззнаковым.