Как автоматически обновлять метку времени в PostgreSQL

Я хочу, чтобы код мог автоматически обновлять отметку времени, когда новая строка вставлена, как я могу сделать в MySQL, используя CURRENT_TIMESTAMP.

Как я смогу достичь этого в PostgreSQL?

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

4 ответов


чтобы заполнить столбец во время вставки, используйте 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
)

обратите внимание, что значение для этого столбца может быть явно перезаписано, указав значение в INSERT заявление. Если вы хотите предотвратить это, вам нужно триггер.

вам также нужен триггер, если вам нужно обновить этот столбец всякий раз, когда строка обновляется (как упоминается Э. Дж. Бреннан)

обратите внимание, что использование зарезервированные слова для имен столбцов обычно не очень хорошая идея. Вы должны найти другое имя, чем timestamp


вам нужно написать триггер вставки и, возможно, триггер обновления, если вы хотите, чтобы он изменился при изменении записи. Эта статья объясняет это довольно хорошо:

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';

применить триггер следующим образом:

CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON customer FOR EACH ROW EXECUTE PROCEDURE  update_modified_column();

обновление метки времени, только если значения изменились

судя по ссылке Э. Д., и добавить, если заявление по этой ссылке (https://stackoverflow.com/a/3084254/1526023)

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';

использование 'now ()' в качестве значения по умолчанию автоматически генерирует отметку времени.