2010-02-23 2 views
9
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 следующим образом:MySQL внешний ключ к одной и той же таблицы завершилась с ошибкой 1005, Errno 150

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 

Почему это так?

ответ

11

Самостоятельное обращение должно быть возможным. Это потому, что «родитель» не имеет знака, а «id» - нет. Измените столбец идентификаторов таблиц на

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 

и он будет работать.

В reference государства о внешних ключах: «Размер и знак целочисленных типов должны быть одинаковыми»

Кажется, та же проблема, описанная here

1

Если проверить состояние двигателя InnoDB (SHOW ENGINE InnoDB STATUS), вы получите более полное объяснение:

Последняя FOREIGN KEY ERROR

[...]

Невозможно найти индекс в ссылочной таблице, где ссылочные столбцы отображаются в качестве первых столбцов, или типы столбцов в таблице, а ссылочная таблица не соответствует ограничениям.

id неподписанный.

Смежные вопросы