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


87

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

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

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.