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

时间:2011-05-04 19:17:26

标签: 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);

然后我尝试添加外键:

ALTER TABLE `Table1`
  ADD CONSTRAINT `Table1_ibfk_2` 
    FOREIGN KEY (`parentId`) REFERENCES `Table1` (`id`);

并获得以下错误:

ERROR 1005 (HY000): Can't create table 'sandbox.#sql-c28_4c' (errno: 150)

有什么问题?

我跑

SHOW ENGINE INNODB STATUS;

最新的外国关键错误如下:

------------------------
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`)
------------

但它并没有帮助我认识到错误。

我使用Windows Vista,MySql 5.5.11

更新

从MySql 5.0.67升级时会出现此问题。

5 个答案:

答案 0 :(得分:4)

<强>背景

  

ERROR 1005(HY000):无法创建表'sandbox。#sql-c28_4c'(错误号:150)

当你命令MySQL到ALTER TABLE时,它确实执行了以下步骤:

  1. 将现有表中的数据复制到新的临时表中。
  2. 更改新临时表的结构
  3. 删除旧表
  4. 将临时表重命名为old_table_name。
  5. <强>问题
    您的请求在步骤1中失败。
    请注意,表名链接到文件 在Linux上,表格名称区分大小写

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

    <强>答案
    因为你显然在运行linux,所以你REFERENCES表的情况需要与该表的定义相同,可能都是小写的。
    您正在运行Windows,因此区分大小写不应该是一个问题,也许它是您正在使用的工具,我也遇到过这些问题,并且使用全部小写的表格来解决我的问题。

    正确答案
    设置系统变量

    lower_case_table_names=1
    

    摆脱这个问题。

    注意如果您在Windows上有lower_case_table_names=2,那么就MySQL而言,您的Windoze框会变成区分大小写的 Linux框。

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

答案 1 :(得分:1)

找到解决方法。

REFERENCES之后,表名称应为小写。

ALTER TABLE `Table1`
  ADD CONSTRAINT `Table1_ibfk_2` 
    FOREIGN KEY (`parentId`) REFERENCES `table1` (`id`);

看起来像MySql 5.5.11中的bug。

FI。 phpmyadmin无法添加外键。

导出也会生成小写表名。

MySql 5.1.56按预期工作。

答案 2 :(得分:1)

在我的情况下,这是因为作为外键字段的字段名称太长,即。 foreign key (some_other_table_with_long_name_id)。试试......更短。在这种情况下,错误消息有点误导。

字段定义也必须相同(注意unsigned子类型。)

答案 3 :(得分:0)

我认为你的外键声明可能是错误的,这取决于你真正追求的是什么。这似乎是说'Table1'中的'parentID'将引用'Table1'中的'id'字段。

ALTER TABLE `Table1`
  ADD CONSTRAINT `Table1_ibfk_2` 
  FOREIGN KEY (`parentId`) REFERENCES `Table1` (`id`);

也许试试这个:

ALTER TABLE `Table1`
  ADD CONSTRAINT `Table1_ibfk_2` 
  FOREIGN KEY (`id`) REFERENCES Parent(`parentId`);

答案 4 :(得分:0)

我有同样的例外:

[PDOException]                                                                                
  SQLSTATE[HY000]: General error: 1005 Can't create table 'service.#sql-4851_c07' (errno: 150) 

我遇到的问题是,我想要创建外键的字段不允许为NULL :)在我弄清楚之后我必须让它被允许为空,一切都开始工作了。

当然,在最初的问题中,情况并非如此,我只是想让别人知道可能的解决方案。