我在生产数据库中有一些预先存在的表。当我运行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。
答案 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]