在此处记录此错误和解决方案,以防它对任何人有所帮助。我们在 Amazon RDS 上有一个 MYSQL 8 数据库。下面的 group by 过去在 Mysql 5.7 上工作得很好,但是
1022 Can't write; duplicate key in table '/rdsdbdata/tmp/#sqlf80_1656bc_0'
一旦我们升级到 Mysql 8,它就开始出错了。
GROUP BY DATE_FORMAT(CONCAT(YEAR(performance_stats_date),'-',
MONTH(performance_stats_date),'-',DAY(performance_stats_date)),
'%Y-%m-%d')
那是错误的使用方式
DATE_FORMAT
。它被赋予一个DATE
或DATETIME
和一个提供“格式”的字符串。例子:在你的情况下,它会像
但这更简单:
如需进一步讨论,请提供
当查询在执行查询和 internal_tmp_mem_storage_engine=TempTable(默认)设置时创建内部临时表时导致错误。
对于使用 group by 子句的查询以及查询使用的表具有大量列时,您很可能会看到此错误。
这是 MySQL-8 中的一个错误,以下是目前的解决方法。
解决方法:
运行查询。
我们找到了两种解决方案:
1. 要么减少查询中的列数(在我们的例子中,我们在这个特定查询中大约有 800 列,将其减少到不到 100 列即可解决问题)
2. 或者将组简化为声明类似
GROUP BY performance_stats_date
您很可能已经有一个名为“x”的约束(您要创建的那个)。
约束对于整个数据库必须是唯一的,而不仅仅是您正在创建/更改的特定表。
要找出当前使用约束的位置,您可以使用以下查询:
作为一种解决方案,您可以尝试为此约束使用另一个名称。