Atualizar o carimbo de data / hora quando a linha for atualizada no PostgreSQL

87

No MySQL, podemos executar isso onde ele atualiza a coluna changetimestampsempre que a linha é alterada:

create table ab (
  id int, 
  changetimestamp timestamp 
    NOT NULL 
    default CURRENT_TIMESTAMP 
    on update CURRENT_TIMESTAMP 
);

Existe algo semelhante a fazer o acima no PostgreSQL?

bichonfrise74
fonte
afaik não é tão fácil no PostgreSQL onde você precisa de um gatilho: pointbeing.net/weblog/2008/03/…
Mechanical_meat
2
É importante notar que o MySQL tem uma série de "tratamentos especiais" para timestampcolunas dependendo da versão e configurações, que (felizmente!) Não podem ser reproduzidos no Postgres. Como permitir 0uma timestampcoluna ou transformar NULLno carimbo de data / hora atual na entrada em certas constelações. Certifique-se de estudar o manual de ambos RDBMS para estar ciente das diferenças sutis: MySQL e Postgres .
Erwin Brandstetter
1
@ErwinBrandstetter é a resposta fornecida abaixo ainda a melhor prática para a atualização automática de carimbos de data / hora em 2018?
CommonSenseCode

Respostas:

127

Crie uma função que atualize a coluna changetimestamp de uma tabela assim:

CREATE OR REPLACE FUNCTION update_changetimestamp_column()
RETURNS TRIGGER AS $$
BEGIN
   NEW.changetimestamp = now(); 
   RETURN NEW;
END;
$$ language 'plpgsql';

Crie um gatilho na tabela que chama a função update_changetimestamp_column () sempre que ocorre uma atualização da seguinte forma:

    CREATE TRIGGER update_ab_changetimestamp BEFORE UPDATE
    ON ab FOR EACH ROW EXECUTE PROCEDURE 
    update_changetimestamp_column();
Charles Ma
fonte
2
Então, não há outra maneira de fazer o que eu quero, exceto por meio de um gatilho? Porque eu gostaria de implementar 'on update timestamp' para todas as minhas tabelas, possivelmente mais de 300. E estou pensando que a criação de gatilhos pode causar alguns problemas de desempenho.
bichonfrise74
5
Pelo que eu sei, essa é a maneira padrão de fazer isso no postgresql. Quando você escreve "on update current_timestamp" no mysql, ele cria um gatilho na tabela em segundo plano. A diferença é que você está escrevendo o gatilho aqui manualmente em vez de tê-lo escrito para você.
Charles Ma
3
Praticamente não há penalidade de desempenho - pelo menos em qualquer banco de dados sensato.
5
Existe uma maneira de dar o nome da coluna que precisa ser atualizada como parâmetro para a função update_changetimestamp_column?
Antoan Milkov,
7
@womble Provavelmente seria muito útil postar um exemplo disso. Se eu conseguir especificar dinamicamente qual coluna atualizar, vou escrever como uma resposta.
MirroredFate