Eu tenho uma pergunta um pouco estranha. Eu sei sobre inserir na atualização de chave duplicada. Minha pergunta é: existe algo semelhante para exclusões que falham devido a restrições de chave estrangeira?
Por exemplo:
excluir da tabela1 onde value='something';
Porém, a tabela2 possui uma chave estrangeira que depende do valor que desejo excluir na tabela1, portanto, a exclusão falha. Eu gostaria de fazer algo assim:
excluir da tabela1 onde value='something' na chave estrangeira falha atualizar some_other_value='something else';
Sei que parece muito estranho, mas tenho um bom motivo para fazer isso (sem entrar em detalhes, tem a ver com o controle de versão de dados históricos que não podem ser destruídos caso um valor seja referenciado em outro lugar). descobrir como fazer isso com mais de uma consulta, é claro, mas gostaria de fazer isso em uma única consulta, se possível. Tenho certeza que não é possível, mas gostaria de perguntar antes de desistir :)
Obrigado!
Você não pode fazer isso diretamente, pois não há como (que eu possa pensar) alternar
UPDATE
ouDELETE
da mesma consulta ... geralmente uma consulta pode fazer apenas um tipo de operação CRUD (ON DUPLICATE KEY UPDATE
sendo uma exceção a isso).Você poderia, no entanto, fazer com que "parecesse" uma única consulta, com um procedimento armazenado, onde você configuraria um
CONTINUE HANDLER
para o erro de chave estrangeira previsto. O manipulador interceptará o erro e pode ser usado para definir uma variável que você pode testar para ver se encontrou o erro e, portanto, também precisa tentar a consulta de atualização.Isso tentará excluir; se encontrar um erro de chave estrangeira, ele tentará a atualização (e o erro de chave estrangeira será suprimido). O procedimento retornará um conjunto de registros com o número de linhas afetadas por cada consulta e se ocorreu o erro de chave estrangeira. Se o "input_value" não for um
INT
ou aWHERE
cláusula for mais complexa, você precisará modificar a estrutura de acordo.O problema potencial que vejo aqui é que, se a cláusula where for muito ampla e corresponder a algumas linhas que causariam um erro de chave estrangeira e outras linhas que não, a consulta não tratará as linhas individualmente. Isso poderia ser feito por um procedimento mais sofisticado que usasse um cursor para localizar as linhas na cláusula where e tentasse excluí-las ou atualizá-las individualmente por chave primária após identificá-las. Essa abordagem seria menos eficiente, mas mais precisa.