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
)
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
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();
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';
L'utilisation de 'now ()' comme valeur par défaut génère automatiquement un horodatage.