Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Atualização automática de coluna de tempo

Última atualização: Jun 26, 2026

O PostgreSQL não atualiza nativamente uma coluna de timestamp quando uma linha é modificada, diferentemente do MySQL, que oferece o recurso ON UPDATE CURRENT_TIMESTAMP para essa finalidade. O ApsaraDB RDS for PostgreSQL resolve essa limitação com o parâmetro on_update_set_default: ao defini-lo em qualquer coluna de tempo, a expressão DEFAULT da coluna é reavaliada a cada comando UPDATE, mantendo o timestamp atualizado sem necessidade de lógica de trigger.

Pré-requisitos

Antes de começar, verifique se você possui:

  • Uma instância RDS for PostgreSQL executando PostgreSQL 15 ou superior

  • Versão secundária do mecanismo 20241230 ou superior

Para atualizar a versão secundária do mecanismo, consulte Atualizar a versão secundária do mecanismo .

Como funciona

Uma tabela típica possui duas colunas de tempo com semânticas distintas:

  • create_time — definida uma única vez no INSERT e nunca alterada

  • update_time — deve ser atualizada automaticamente a cada UPDATE

O parâmetro on_update_set_default funciona reavaliando a expressão DEFAULT da coluna em cada UPDATE. Esse parâmetro aceita os seguintes tipos de dados de coluna: TIMESTAMP, TIMESTAMPTZ, DATE, TIME, TIMETZ e INTERVAL.

Ativar atualização automática em uma coluna de tempo

Execute a instrução a seguir para ativar a atualização automática de uma coluna:

ALTER TABLE <table> ALTER COLUMN <column> SET (on_update_set_default=true);

Substitua <table> pelo nome da sua tabela e <column> pelo nome da coluna de tempo desejada.

Exemplo

O exemplo a seguir demonstra como o parâmetro on_update_set_default mantém update_time atualizada, enquanto create_time preserva o valor original de inserção.

Etapa 1: Crie uma tabela e insira uma linha.

CREATE TABLE test (id INT, create_time TIMESTAMPTZ DEFAULT now(), update_time TIMESTAMPTZ DEFAULT now());

INSERT INTO test VALUES(1);

SELECT * FROM test;

Saída esperada:

 id |          create_time          |          update_time
----+-------------------------------+-------------------------------
  1 | 2025-01-09 16:07:48.481879+08 | 2025-01-09 16:07:48.481879+08

Etapa 2: Atualize a linha sem ativar a atualização automática.

UPDATE test SET id=2;

SELECT * FROM test;

Saída esperada:

 id |          create_time          |          update_time
----+-------------------------------+-------------------------------
  2 | 2025-01-09 16:07:48.481879+08 | 2025-01-09 16:07:48.481879+08

O valor de update_time permanece inalterado porque on_update_set_default ainda não está ativado.

Etapa 3: Ative a atualização automática na coluna update_time.

ALTER TABLE test ALTER COLUMN update_time SET (on_update_set_default=true);

Verifique se o parâmetro foi definido corretamente:

SELECT attoptions FROM pg_attribute WHERE attname='update_time';

Saída esperada:

       attoptions
------------------------------
 {on_update_set_default=true}

Etapa 4: Atualize a linha novamente e confirme que update_time foi atualizada.

UPDATE test SET id=3;

SELECT * FROM test;

Saída esperada:

 id |          create_time          |          update_time
----+-------------------------------+-------------------------------
  3 | 2025-01-09 16:07:48.481879+08 | 2025-01-09 16:08:39.601701+08

Agora, update_time é atualizada automaticamente a cada UPDATE, enquanto create_time mantém o valor original de inserção.