Sou novo no MySQL, mas tenho uma experiência razoável com o SQL Server. Eu sei que no SQL Server devo ser muito cauteloso ao usar MERGE
instruções porque elas podem levar a alguns problemas . Há alguma preocupação especial que devo ter ao usar ON DUPLICATE KEY UPDATE
? É considerado uma prática recomendada na comunidade MySQL manter INSERT/UPDATE
instruções separadas como no SQL Server ou é bom usar ON DUPLICATE KEY UPDATE
amplamente para upserts simples?
relate perguntas
-
Existem ferramentas de benchmarking do MySQL? [fechado]
-
Onde posso encontrar o log lento do mysql?
-
Como posso otimizar um mysqldump de um banco de dados grande?
-
Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?
-
Como um grupo pode rastrear alterações no esquema do banco de dados?
Em primeiro lugar:
Existem alguns casos bastante raros para se preocupar e coisas que podem incomodar você - especialmente considerando que você vem do mundo do SQL Server:
Quando você o usa em uma tabela com duas ou mais
UNIQUE
restrições. Nesses casos, você não pode definir facilmente comportamentos diferentes para diferentes violações de restrição (embora seja possível com aMERGE
instrução).Um
INSERT
que viole 1 das 2 restrições únicas irá para aUPDATE
cláusula. Se você quiser um comportamento diferente dependendo de qual restrição for violada, será difícil implementá-lo (possivelmente com algumasCASE
expressões complexas, mas pode não ser viável em todos os cenários).Uma grande diferença com o SQL Server (e todas as outras implementações principais do SQL) é que
UNIQUE
as restrições são verificadas após cada linhaINSERT
ouUPDATE
não como o padrão SQL diz no final da instrução (e nem pense em verificações de restrição adiadas).O problema com isso é para uma
INSERT ... SELECT ... ON DUPLICATE KEY UPDATE ...;
instrução, a ordem de como as linhas são processadas é importante. Se o SELECT criar 2 linhas para serem inseridas que conflitem em uma restrição UNIQUE, a primeira a ser processada será inserida e a segunda cairá para aUPDATE
cláusula (e a ordem de processamento obviamente dependerá do plano de execução). Isso significa resultado não determinístico no estado da tabela após a instrução. Portanto, é preciso ter muito cuidado ao escrever essas declarações (e qualquerUPDATE
declaração, na verdade).Relacionado ao ponto anterior, as
INSERT ... ON DUPLICATE KEY UPDATE
instruções são marcadas como não seguras para replicação baseada em instrução, portanto, se você usá-las, ficará restrito à replicação baseada em linha ou mista.