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如下:

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

为什么是错的?

4

2 回答 2

11

自引用应该是可能的。这是因为“parent”是无符号的,而“id”不是。将表定义 id 列更改为

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

它会起作用。

关于外键的参考声明:“整数类型的大小和符号必须相同”

似乎与此处描述的问题相同

于 2010-02-23T12:22:47.780 回答
1

如果您检查 InnoDB 引擎 ( SHOW ENGINE InnoDB STATUS) 的状态,您将得到更完整的解释:

最新的外键错误

[...]

在被引用的表中找不到被引用的列作为第一列出现的索引,或者表中的列类型与被引用的表的约束不匹配。

使id无符号。

于 2010-02-23T12:29:42.580 回答