Обновить метку времени при обновлении строки в PostgreSQL

87

В MySQL мы можем выполнить это, где он обновляет столбец changetimestampкаждый раз, когда строка изменяется:

create table ab (
  id int, 
  changetimestamp timestamp 
    NOT NULL 
    default CURRENT_TIMESTAMP 
    on update CURRENT_TIMESTAMP 
);

Есть ли что-то подобное в PostgreSQL?

bichonfrise74
источник
afaik не так просто в PostgreSQL, где вам нужен триггер: pointbeing.net/weblog/2008/03/…
Mechanical_meat
2
Стоит отметить, что MySQL имеет ряд «специальных обработок» для timestampстолбцов в зависимости от версии и настроек, которые (к счастью!) Не могут быть воспроизведены в Postgres. Как позволяя 0для timestampстолбца или преобразования NULLв текущую метку времени на входе в определенных созвездий. Обязательно изучите руководство по обеим РСУБД, чтобы знать о тонких различиях: MySQL и Postgres .
Эрвин Брандштеттер,
1
@ErwinBrandstetter - это ответ, приведенный ниже, по-прежнему лучший способ автообновления меток времени в 2018 году?
CommonSenseCode

Ответы:

127

Создайте функцию, которая обновляет столбец changetimestamp таблицы следующим образом:

CREATE OR REPLACE FUNCTION update_changetimestamp_column()
RETURNS TRIGGER AS $$
BEGIN
   NEW.changetimestamp = now(); 
   RETURN NEW;
END;
$$ language 'plpgsql';

Создайте в таблице триггер, который вызывает функцию update_changetimestamp_column () всякий раз, когда происходит обновление следующим образом:

    CREATE TRIGGER update_ab_changetimestamp BEFORE UPDATE
    ON ab FOR EACH ROW EXECUTE PROCEDURE 
    update_changetimestamp_column();
Чарльз Ма
источник
2
Итак, нет другого способа делать то, что я хочу, кроме как с помощью триггера? Потому что я хотел бы реализовать метку времени обновления для всех моих таблиц, возможно, 300+. И я думаю, что создание триггеров может вызвать проблемы с производительностью.
bichonfrise74
5
Насколько мне известно, это стандартный способ сделать это в postgresql. Когда вы пишете «при обновлении current_timestamp» в mysql, он создает триггер для таблицы в фоновом режиме. Разница в том, что вы пишете здесь триггер вручную, а не за вас.
Чарльз Ма
3
Практически нет потери производительности - по крайней мере, в любой разумной базе данных.
5
Есть ли способ указать имя столбца, который необходимо обновить, в качестве параметра функции update_changetimestamp_column?
Антуан Милков 02
7
@womble Было бы очень полезно опубликовать пример этого. Если мне удастся динамически указать, какой столбец обновлять, я напишу это как ответ.
MirroredFate