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?


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();

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.