Disparar para ATUALIZAR após ATUALIZAÇÃO?

13

Quero fazer um gatilho para registrar o horário de qualquer atualização como:

CREATE TRIGGER col_update
AFTER UPDATE ON col
FOR EACH ROW BEGIN
UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id
END

O problema é que, quando esse gatilho tenta atualizar a updatedcoluna, também é outro evento de atualização, que executa o gatilho. Isso criará um loop infinito, que não funciona.

Como posso armazenar o tempo de atualização na coluna correspondente?

Desejo usar um gatilho porque há muitas colunas na tabela. Se eu tentar definir o horário da atualização manualmente, precisarei modificar muitas consultas.

Googlebot
fonte

Respostas:

17

Em BEFOREvez disso, use um gatilho e defina a updatedcoluna que atribui um valor NEW.updated(isso seria uma atribuição simples, não uma UPDATE). Dessa forma, você não ativará UPDATEs adicionais .

Seu corpo de gatilho simplesmente parecerá

SET NEW.updated = NOW()

Normalmente, uso AFTERgatilhos apenas para modificar outras tabelas, BEFOREpara modificar a nova linha (ou atualizada) ou suprimir DELETE.

dezso
fonte
1

Se, como no seu caso, você desejar alterar o campo atualizado sempre que o registro for alterado, não será necessário acionar.

Você pode usar a inicialização / atualização automática do MySQL assim:

ALTER TABLE `yourtabelname` ADD `updated` DATETIME on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

Ou no momento da criação da tabela, nos documentos :

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Tobias Beuving
fonte