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

Mysql 错误1059:现有表的外键约束上的标识符名称太长,mysql,database,amazon-web-services,rds,Mysql,Database,Amazon Web Services,Rds,我在生产数据库中有一些预先存在的表。当我运行show create table existing_table时,它显示了创建表所需的SQL,其中涉及多个约束外键引用,这些引用涉及名称如下的约束: _XXXXXXXXXX uuXXXXXXXXXX xx f87560e38ebd0f6 fk U客户id 这似乎很正常,但当我尝试创建一个tmp表(如new_existing_table,运行与create table查询中所示相同的SQL)时,会出现以下错误: 错误1059 42000:标识符名称“\

我在生产数据库中有一些预先存在的表。当我运行show create table existing_table时,它显示了创建表所需的SQL,其中涉及多个约束外键引用,这些引用涉及名称如下的约束:

_XXXXXXXXXX uuXXXXXXXXXX xx f87560e38ebd0f6 fk U客户id

这似乎很正常,但当我尝试创建一个tmp表(如new_existing_table,运行与create table查询中所示相同的SQL)时,会出现以下错误:

错误1059 42000:标识符名称“\uxxxxxxxxxxx\uxxxxxxx\uxxxxxx\u xx\u 7435260ed6a242b0\u fk\u客户id”太长

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


我正在Amazon RDS上使用MySQL和InnoDB。

这看起来像是一个与相关的问题,MySQL服务器版本5.1.69、5.5.31、5.6.11和5.7.1中修复了这个问题

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

问题是,该错误允许创建具有无效定义的表,因此这里重要的服务器版本不是您试图加载到的服务器版本,而是创建表时和创建位置运行的服务器版本。修复程序除了防止新创建的表具有无效的自动生成标识符之外,没有做任何其他事情

标识符是约束标识符,其值并不特别重要-它只用于在错误消息中告诉您即将被违反的外键约束。。。所以你可以把它去掉。唯一需要显式声明的时间是自动生成的文件太大的时候

从中,您会注意到关键字约束是可选的,即使提供了,它后面的符号仍然是可选的。符号就是给你带来问题的元素。限制为64个字符。一直都是这样,但由于一个bug,限制没有被正确地施加

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

听起来我有麻烦了。。。。手动重命名约束是一个坏主意吗?InnoDB通常会自动生成约束,并且它们没有任何语义含义,因此不会有任何区别。如果您的代码以某种方式引用它们,希望它们包含比有效名称更长的名称,那么至少在理论上,该代码已经被破坏了。