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