添加FOREIGN KEY时出错"无法创建表..."

ser*_*gtk 8 mysql foreign-keys

我已经通过脚本创建了表:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

DROP TABLE IF EXISTS `Table1`;
CREATE TABLE IF NOT EXISTS `Table1` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `parentId` bigint(20) DEFAULT NULL,
  `name` varchar(1024) NOT NULL,
  `description` varchar(16384) NOT NULL DEFAULT '',
  `imageId` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`name`(255)),
  KEY `parentId` (`parentId`),
  KEY `imageId` (`imageId`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=27 ;


INSERT INTO `Table1` (`id`, `parentId`, `name`, `description`, `imageId`) VALUES
(0, NULL, 'name1', '', NULL),
(12, 0, 'name2', '', NULL);
Run Code Online (Sandbox Code Playgroud)

然后我尝试添加外键:

ALTER TABLE `Table1`
  ADD CONSTRAINT `Table1_ibfk_2` 
    FOREIGN KEY (`parentId`) REFERENCES `Table1` (`id`);
Run Code Online (Sandbox Code Playgroud)

并获得以下错误:

ERROR 1005 (HY000): Can't create table 'sandbox.#sql-c28_4c' (errno: 150)
Run Code Online (Sandbox Code Playgroud)

怎么了?

我跑

SHOW ENGINE INNODB STATUS;
Run Code Online (Sandbox Code Playgroud)

有最新的外键错误如下:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
110504 22:06:55 Error in foreign key constraint of table sandbox/#sql-c28_61:

    FOREIGN KEY (`parentId`) REFERENCES `Table1` (`id`):
Cannot resolve table name close to:
 (`id`)
------------
Run Code Online (Sandbox Code Playgroud)

但它并没有帮助我认识到什么是错的.

我使用Windows Vista,MySql 5.5.11

更新:

从MySql 5.0.67升级时出现问题.

Joh*_*ica 5

背景

错误 1005 (HY000): 无法创建表 'sandbox.#sql-c28_4c' (errno: 150)

当你命令 MySQL 时,ALTER TABLE它实际上执行以下步骤:

  1. 将数据从现有表复制到新的临时表。
  2. 更改新临时表的结构
  3. 删除旧表
  4. 将临时表重命名为 old_table_name。

问题
您的请求在步骤 1 中失败。
请注意,表名链接到文件。
在 Linux 上表名区分大小写

在 Windows 上,它们不区分大小写。

回答
由于您显然运行的是linux,因此您要使用的表的大小写REFERENCES需要与该表的定义中的大小写相同,可能全部小写。
您正在运行Windows,因此区分大小写不应该成为问题,也许这是您正在使用的工具,我也遇到了这些问题,并且在所有地方使用所有小写的表名解决了我的问题。

正确答案
设置系统变量

lower_case_table_names=1
Run Code Online (Sandbox Code Playgroud)

为了摆脱这个问题。

请注意,如果您使用的是 Windows,则就 MySQL 而言,lower_case_table_names=2您的 Windoze 盒子将变成区分大小写的Linux 盒子!

链接
http://dev.mysql.com/doc/refman/5.5/en/identifier-case-sensitivity.html