错误1059:来自现有表的外键约束的标识符名称太长

时间:2015-02-19 20:07:06

标签: mysql database amazon-web-services rds

我在生产数据库中有一些预先存在的表。当我运行show create table existing_table时,它会显示创建表所需的SQL,其中包含几个涉及名称的CONSTRAINT FOREIGN KEY REFERENCES约束:

_xxxxxxxxxxx_xxxxxxxxxxx_xx_f87560e38ebd0f6_fk_customer_customer_id

这看起来很正常,但是当我尝试创建一个像new_existing_table这样的tmp表运行与create table查询中显示的相同的SQL时,我收到以下错误:

ERROR 1059 (42000): Identifier name '_xxxxxxxxxxxx_xxxxxxx_xxxxxx_xx_7435260ed6a242b0_fk_customer_customer_id' is too long

如果这是生成原始表的SQL,那么在创建新表时它是如何失败的?即使我使表名很短,如tmp,我也会得到同样的错误。

我在Amazon RDS上使用MySQL,InnoDB。

1 个答案:

答案 0 :(得分:4)

这看起来像是与MySQL Bug #44541相关的问题,已在MySQL服务器版本5.1.69,5.5.31,5.6.11和5.7.1中修复。

  

未检查内部生成的外键名称的长度。如果内部生成的外键名称超过64个字符限制,则会导致SHOW CREATE TABLE的DDL无效。此修复程序检查内部生成的外键名称的长度,并在超出限制时报告错误消息。

问题是,错误允许创建具有无效定义的表,因此这里重要的服务器版本不是您尝试加载的服务器版本 - 它是在何时何地运行的服务器版本该表已创建。除了防止新创建的表具有无效的自动生成标识符之外,该修复程序不会执行任何操作。

标识符是约束标识符,其值并不是特别重要 - 它仅用于在错误消息中告诉您即将违反的外键约束...因此您只需删除它。唯一需要明确声明它的时间是自动生成的那个太大了。

http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html开始,您会注意到关键字CONSTRAINT是可选的,即使提供,其后面的symbol仍然是可选的。 symbol是给你一个问题的元素。它限制为64个字符。它一直是,但由于一个错误,限制没有适当强加。

[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]