Якщо ви працювали з MySQL, вам, ймовірно, знайома функція ON UPDATE CURRENT_TIMESTAMP
. Вона автоматично оновлює колонку datetime
кожного разу, коли рядок змінюється. У PostgreSQL такої функціональності "з коробки" немає, але це можна легко реалізувати за допомогою тригера.
У цій статті я покажу, як можна реалізувати це простим і багаторазовим способом за допомогою тригера, надаючи практичний приклад.
📌 Проблема
Розглянемо таку таблицю:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT now()
);
У MySQL це можна просто реалізувати так:
updatedat TIMESTAMP DEFAULT CURRENTTIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Це дозволяє автоматично оновлювати колонку updated_at
. У PostgreSQL така поведінка потребує додаткової реалізації.
Рішення через тригер
Ми можемо створити функцію, яка встановлюватиме значення поля updated_at
на поточну дату й час при кожному оновленні рядка, і потім прив'язати цю функцію до тригера таблиці.
1. Створення функції тригера:
CREATE OR REPLACE FUNCTION setupdatedat()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
2. Прив’язка тригера до таблиці:
CREATE TRIGGER triggersetupdatedat
BEFORE UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION setupdated_at();
Тепер кожне оновлення рядка в таблиці users
автоматично оновлюватиме поле updated_at
.
Практичний приклад
INSERT INTO users (name) VALUES ('John Doe');
-- updatedat встановлюється на поточний час
UPDATE users SET name = 'John Doe Jr.' WHERE id = 1;
-- updatedat оновлюється автоматично через тригер
Порада на бонус: Багаторазове використання
Функцію set_updated_at()
можна використовувати для кількох таблиць. Просто створіть новий тригер для кожної таблиці та прив’яжіть його до тієї ж функції.
Висновок
Хоча PostgreSQL не має вбудованої функції ON UPDATE CURRENT_TIMESTAMP
, як MySQL, таку поведінку легко реалізувати через тригер. Це чисте, ефективне та багаторазове рішення, яке чудово працює в реальних застосунках.
Сподіваюся, стаття була корисною. Якщо у вас є питання або пропозиції, не соромтесь коментувати або зв'язатися зі мною.
Перекладено з: How to Simulate ON UPDATE CURRENT_TIMESTAMP from MySQL in PostgreSQL Using a Trigger