Как автоматически обновлять временную метку в 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
)

Ответ 1

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

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

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

Ответ 2

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

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();

Ответ 3

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

На основе ссылки E.J и добавьте оператор if из этой ссылки (fooobar.com/questions/88765/...)

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

Ответ 4

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