web-dev-qa-db-fra.com

Comment mettre à jour automatiquement un horodatage dans PostgreSQL

Je veux que le code puisse mettre à jour automatiquement l'horodatage lorsqu'une nouvelle ligne est insérée, comme je peux le faire dans MySQL avec CURRENT_TIMESTAMP.

Comment vais-je pouvoir réaliser cela dans PostgreSQL?

CREATE TABLE users (
    id serial not null,
    firstname varchar(100),
    middlename varchar(100),
    lastname varchar(100),
    email varchar(200),
    timestamp timestamp
)
100
Aaron

Pour renseigner la colonne lors de l'insertion, utilisez une valeur DEFAULT :

CREATE TABLE users (
  id serial not null,
  firstname varchar(100),
  middlename varchar(100),
  lastname varchar(100),
  email varchar(200),
  timestamp timestamp default current_timestamp
)

Notez que la valeur de cette colonne peut être explicitement remplacée en fournissant une valeur dans l'instruction INSERT . Si vous voulez éviter cela, vous avez besoin d'un déclencheur .

Vous avez également besoin d'un déclencheur si vous devez mettre à jour cette colonne chaque fois que la ligne est mise à jour (comme mentionné par E.J. Brennan )

Notez que l'utilisation de mots réservés pour les noms de colonnes n'est généralement pas une bonne idée. Vous devriez trouver un nom différent de timestamp

164

Vous devrez écrire un déclencheur d'insertion et éventuellement un déclencheur de mise à jour si vous souhaitez que celui-ci change lorsque l'enregistrement est modifié. Cet article l'explique assez bien:

http://www.revsys.com/blog/2006/aug/04/automatically-updating-a-timestamp-column-in-postgresql/

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

Appliquez le déclencheur comme ceci:

CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON customer FOR EACH ROW EXECUTE PROCEDURE  update_modified_column();
80
E.J. Brennan

Mise à jour de l'horodatage, uniquement si les valeurs ont changé

Basé sur le lien de E.J et ajoutez une instruction if à partir de ce lien ( https://stackoverflow.com/a/3084254/152602 )

CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
   IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
      NEW.modified = now(); 
      RETURN NEW;
   ELSE
      RETURN OLD;
   END IF;
END;
$$ language 'plpgsql';
44
Jim Yu

L'utilisation de 'now ()' comme valeur par défaut génère automatiquement un horodatage.

6
Parichay Mo