我已经通过脚本创建了表:
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升级时会出现此问题。
答案 0 :(得分:4)
<强>背景强>
ERROR 1005(HY000):无法创建表'sandbox。#sql-c28_4c'(错误号:150)
当你命令MySQL到ALTER TABLE
时,它确实执行了以下步骤:
<强>问题强>
您的请求在步骤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 :)在我弄清楚之后我必须让它被允许为空,一切都开始工作了。
当然,在最初的问题中,情况并非如此,我只是想让别人知道可能的解决方案。