Documentando este erro e solução aqui, caso possa ajudar alguém. Temos um banco de dados MYSQL 8 no Amazon RDS. O grupo abaixo costumava funcionar bem no Mysql 5.7, mas começou a dar
1022 Can't write; duplicate key in table '/rdsdbdata/tmp/#sqlf80_1656bc_0'
erro quando atualizamos para o Mysql 8.
GROUP BY DATE_FORMAT(CONCAT(YEAR(performance_stats_date),'-',
MONTH(performance_stats_date),'-',DAY(performance_stats_date)),
'%Y-%m-%d')
Essa é a maneira errada de usar
DATE_FORMAT
. É dado umDATE
ouDATETIME
e uma string fornecendo a 'formatação'. Exemplo:No seu caso seria algo como
Mas isso é ainda mais simples:
Para uma discussão mais aprofundada, forneça
Erro causado quando a consulta cria uma tabela temporária interna ao executar uma consulta e configuração internal_tmp_mem_storage_engine=TempTable (padrão).
provavelmente você verá esse erro para consultas com a cláusula group by e quando as tabelas usadas por consulta tiverem um grande número de colunas.
Este é um bug no MySQL-8 e o seguinte é uma solução alternativa por enquanto.
Gambiarra:
Executar consulta.
Existem duas soluções que encontramos:
1. Ou reduzir o número de colunas na consulta (no nosso caso, temos cerca de 800 colunas nesta consulta específica, reduzindo-a para menos de cerca de 100 resolveu o problema)
2. ou simplificar o grupo por declaração para algo como
GROUP BY performance_stats_date
O mais provável é que você já tenha uma restrição com o nome "x" (a que você está tentando criar).
As restrições devem ser exclusivas para todo o banco de dados, não apenas para a tabela específica que você está criando/alterando.
Para descobrir onde as restrições estão atualmente em uso, você pode usar a seguinte consulta:
como solução, você pode tentar usar outro nome para essa restrição.