Как автоматически обновить временную метку в PostgreSQL - PullRequest
99 голосов
/ 04 марта 2012

Я хочу, чтобы код мог автоматически обновлять отметку времени при вставке новой строки, как я могу это сделать в 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 ]

160 голосов
/ 04 марта 2012

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

Вам также необходим триггер, если вам нужно обновлять этот столбец при каждом обновлении строки (как упомянуто EJ Brennan )

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

77 голосов
/ 04 марта 2012

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

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();
43 голосов
/ 09 октября 2014

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

На основе ссылки EJ и добавьте оператор if из этой ссылки (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';
6 голосов
/ 06 июня 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...