1
resposta

UPDATE/SET - BEFORE/AFTER - DELIMITER

Fiquei com dúvida nos conceitos.

1- Por que o SET é o comando ideal e não o UPDATE? Nas justificativas do exercício não diz que o UPDATE não funciona. Estou tentando com o UPDATE e realmente não está funcionando. Gostaria de uma justificativa por favor;

2- Vi a resposta para a Flavia quanto ao uso do BEFORE por questões didáticas, mas não concordo. Se atualizamos a tabela antes da inserção do dado, logo a tabela nunca estará atualizada.

3- No workbench o DELIMITER não muda de cor. Parece até que não está funcionando. Existe alguma atualização onde o código mudou de nome ou algo assim?

Segue meu código:

DELIMITER //
CREATE TRIGGER TG_CLIENTES_IDADE_INSERT AFTER INSERT ON CLIENTES
FOR EACH ROW BEGIN
    UPDATE CLIENTES SET IDADE = timestampdiff(YEAR, DATA_NASCIMENTO, NOW());
END//
1 resposta

Olá André, tudo bem?

Gostaria primeiramente de endossar suas dúvidas como um todo. Acredito que este exercício merece ser refeito como todo, está gerando bastante dúvidas. Porém também é positivo pois gera interação por aqui.

Algumas considerações para adição aos seus pontos:

1) https://stackoverflow.com/questions/15300673/mysql-error-cant-update-table-in-stored-function-trigger-because-it-is-already Neste link conseguimos ver esse questionamento perando a impossibilidade de utilizar o esquema de trigger/insert/after/update, e dentro da resposta escolhida como ideal, o que mas me fez sentido foi:

"You cannot change a table while the INSERT trigger is firing. The INSERT might do some locking which could result in a deadlock. Also, updating the table from a trigger would then cause the same trigger to fire again in an infinite recursive loop. Both of these reasons are why MySQL prevents you from doing this."

2) O uso de NEW em:

SET **NEW**.IDADE = timestampdiff(YEAR, **NEW**.DATA_NASCIMENTO, NOW())

Faz com que mesmo sendo um trigger com BEFORE, nós realizemos o acesso ao que virá a ser inserido. E é por isso que o código do exercício funciona se testado, porém apenas atualizando os NOVOS acréscimos.

3) Estou utilizando o WorkBench 8.0.23 e também presenciando problemas com o uso do DELIMITER. Após rodar pela primeira vez o código de criação do TRIGGER, o que funciona normalmente, o DELIMITER não retorna automaticamente para ";", atrapalhando muito na usabilidade do programa. Tentei procurar pela internet e há na documentação dizendo sobre utilizar "DELIMITER ;". Porém não há êxito, e nem mesmo mensagem de sucesso/erro.