Оновіть позначку часу, коли рядок оновлюється в PostgreSQL


85

У 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

Відповіді:


124

Створіть функцію, яка оновлює стовпець мітки зміни таблиці таким чином:

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. Коли ви пишете "on update current_timestamp" у mysql, це створює тригер у таблиці у фоновому режимі. Різниця полягає в тому, що ви пишете тут тригер вручну, замість того, щоб писати його для вас.
Charles Ma

3
Штрафу за продуктивність практично не передбачено - принаймні в будь-якій розумній базі даних.

5
Чи є спосіб дати функції назви стовпця, яке потрібно оновити як параметр update_changetimestamp_column?
Антоан Мілков

7
@womble Можливо, було б дуже корисно опублікувати приклад цього. Якщо мені вдасться динамічно вказати, який стовпець оновлювати, я напишу це як відповідь.
MirroredFate
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.