Contrairement à MySQL qui propose l'instruction ON UPDATE CURRENT_TIMESTAMP, PostgreSQL ne met pas à jour nativement une colonne d'horodatage lors de la modification d'une ligne. ApsaraDB RDS for PostgreSQL comble cette lacune grâce au paramètre on_update_set_default : appliquez-le à n'importe quelle colonne temporelle et l'expression DEFAULT de la colonne sera réévaluée à chaque instruction UPDATE. L'horodatage reste ainsi à jour sans nécessiter de déclencheur.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance RDS for PostgreSQL exécutant PostgreSQL 15 ou une version ultérieure
Une version mineure du moteur 20241230 ou une version ultérieure
Pour mettre à niveau la version mineure du moteur, consultez la rubrique Mettre à jour la version mineure du moteur .
Fonctionnement
Une table classique contient généralement deux colonnes temporelles aux sémantiques distinctes :
create_time: définie une seule fois lors de l'opérationINSERTet jamais modifiée par la suiteupdate_time: doit être actualisée automatiquement à chaque opérationUPDATE
Le paramètre on_update_set_default fonctionne en réévaluant l'expression DEFAULT de la colonne lors de chaque opération UPDATE. Ce paramètre prend en charge les types de données de colonne suivants : TIMESTAMP, TIMESTAMPTZ, DATE, TIME, TIMETZ et INTERVAL.
Activer la mise à jour automatique sur une colonne temporelle
Exécutez l'instruction suivante pour activer la mise à jour automatique d'une colonne :
ALTER TABLE <table> ALTER COLUMN <column> SET (on_update_set_default=true);
Remplacez <table> par le nom de votre table et <column> par le nom de la colonne temporelle cible.
Exemple
L'exemple ci-dessous illustre comment on_update_set_default maintient la colonne update_time à jour, tandis que la colonne create_time conserve sa valeur d'insertion initiale.
Étape 1 : Créez une table et insérez une ligne.
CREATE TABLE test (id INT, create_time TIMESTAMPTZ DEFAULT now(), update_time TIMESTAMPTZ DEFAULT now());
INSERT INTO test VALUES(1);
SELECT * FROM test;
Résultat attendu :
id | create_time | update_time
----+-------------------------------+-------------------------------
1 | 2025-01-09 16:07:48.481879+08 | 2025-01-09 16:07:48.481879+08
Étape 2 : Mettez à jour la ligne sans avoir activé la mise à jour automatique.
UPDATE test SET id=2;
SELECT * FROM test;
Résultat attendu :
id | create_time | update_time
----+-------------------------------+-------------------------------
2 | 2025-01-09 16:07:48.481879+08 | 2025-01-09 16:07:48.481879+08
La colonne update_time reste inchangée car le paramètre on_update_set_default n'est pas encore activé.
Étape 3 : Activez la mise à jour automatique sur la colonne update_time.
ALTER TABLE test ALTER COLUMN update_time SET (on_update_set_default=true);
Vérifiez que le paramètre est bien défini :
SELECT attoptions FROM pg_attribute WHERE attname='update_time';
Résultat attendu :
attoptions
------------------------------
{on_update_set_default=true}
Étape 4 : Mettez à nouveau à jour la ligne et confirmez que update_time est actualisé.
UPDATE test SET id=3;
SELECT * FROM test;
Résultat attendu :
id | create_time | update_time
----+-------------------------------+-------------------------------
3 | 2025-01-09 16:07:48.481879+08 | 2025-01-09 16:08:39.601701+08
La colonne update_time s'actualise désormais automatiquement à chaque instruction UPDATE, tandis que la colonne create_time conserve sa valeur d'insertion initiale.