同一个表的 MySQL 外键失败,错误 1005,errno 150

发布于 2024-08-22 19:18:58 字数 554 浏览 13 评论 0原文

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

为什么会出错?

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 as follows:

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

Why is it wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

金兰素衣 2024-08-29 19:18:58

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

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

,它将起作用。

参考说明了有关外键的信息: “整数类型的大小和符号必须相同”

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

Self reference should be possible. It's because "parent" is unsigned and "id" is not. Change the table definitions id column to

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

and it will work.

The reference states about foreign keys: "The size and sign of integer types must be the same"

Seems to be the same problem described here

左秋 2024-08-29 19:18:58

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

最新外键错误

[...]

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

使id无符号。

If you check the status of the InnoDB engine (SHOW ENGINE InnoDB STATUS), you'll get a fuller explanation:

LATEST FOREIGN KEY ERROR

[...]

Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint.

Make id unsigned.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文