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 noINSERTe nunca alteradaupdate_time— deve ser atualizada automaticamente a cadaUPDATE
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.