A única solução suportada pelo MySQL e pelo HSQLDB é consultar as linhas que você pretende substituir e, condicionalmente, INSERT ou UPDATE. Isso significa que você precisa escrever mais código de aplicativo para compensar as diferenças entre as implementações de RDBMS.
- INICIAR TRANSAÇÃO.
- SELECIONE... PARA ATUALIZAR.
- Se o SELECT encontrar linhas, então UPDATE.
- Senão, INSERIR.
- COMPROMETA-SE.
O MySQL não suporta a instrução ANSI SQL MERGE. Ele suporta REPLACE e INSERT...ON DUPLICATE KEY UPDATE. Veja minha resposta para " INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE" para mais sobre isso.
Re comentários:Sim, outra abordagem é apenas tentar o INSERT e ver se funciona. Caso contrário, faça um UPDATE. Se você tentar o INSERT e ele acertar uma chave duplicada, vai gerar um erro, que se transforma em uma exceção em algumas interfaces de cliente. A desvantagem de fazer isso no MySQL é que ele gera um novo ID de incremento automático mesmo se o INSERT falhar. Então você acaba com lacunas. Eu sei que as lacunas na sequência de incremento automático normalmente não são algo para se preocupar, mas ajudei um cliente no ano passado que tinha lacunas de 1000-1500 entre inserções bem-sucedidas por causa desse efeito, e o resultado foi que eles esgotaram o intervalo de um INT em sua chave primária.
Como @baraky diz, pode-se tentar o UPDATE primeiro e, se isso afetar zero linhas, faça o INSERT. Meu comentário sobre essa estratégia é que UPDATE zero linhas não é uma exceção - você terá que verificar o "número de linhas afetadas" após o UPDATE para saber se "foi bem-sucedido" ou não.
Mas consultar o número de linhas afetadas retorna ao problema original:você precisa usar consultas diferentes no MySQL versus HSQLDB.
HSQLDB:
CALL DIAGNOSTICS(ROW_COUNT);
MySQL:
SELECT ROW_COUNT();