Posts Antigos

Posts Tagged ‘update’

MySQL e triggers de atualização

Opa =)

Um amigo estava com uma dúvida sobre triggers no MySQL que atualizem dados na mesma tabela, depois de uma operação de insert (ou de update), eu achava que era tranquilo, mas não rola fazer com triggers do tipo After Update (que eu acredito ser o mais lógico), bastando usar triggers do tipo Before Update.

Segue a tradução do artigo do sqllyw,  de 2008, que indica o caminho para a resolução:

————————————————————————————————-

Triggers de MySQL para atualizar campos na própria tabela

Escrito em MySql por sqllyw em 14/04/2008
Confusões de triggers do MySql…

Quase sempre precisamos atualizar um campo em uma tabela que foi atualizada, a impressão imediata é que devemos usar uma trigger do tipo After Update:

#1

create Trigger `update_flag` After Update on `sales` for each row BEGIN
    set new.flag = new.flag2;
end;

A trigger não compilará já que new não pode ser atualizado na trigger After Update, então chegamos nisso:

#2

create Trigger `update_flag` After Update on `sales` for each row BEGIN
    update table sales set flag = flag2 where id = new.id;
end;

mas você receberá um aviso:

“can not update table performer in trigger because it is already used by statement which invoked this trigger”

nesses casos, é necessário uma trigger do tipo Before Update:

#3

create Trigger `update_flag` Before Update on `sales` for each row BEGIN
    set new.flag = new.flag2;
end;


Conclusão:
para atualizar campos da mesma tabela (onde temos uma trigger registrada), use triggers do tipo Before Update de modo que você possa usar  new, se você precisar atualizar campos em uma outra tabela, você pode usar #2.