2010-02-23 63 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失败,错误号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列更改为

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

它会起作用。

有关外键的reference规定:“大小和整数类型的符号必须是相同的”

似乎是同样的问题描述here

1

如果检查InnoDB引擎的状态( SHOW ENGINE InnoDB STATUS),你会得到一个更全面的解释:

国外最新KEY ERROR

[...]

无法在引用表中找到引用列作为第一列显示的索引,或者表中的列类型和引用的表格与约束不匹配。

使id无符号。