Як симулювати ON UPDATE CURRENT_TIMESTAMP з MySQL у PostgreSQL за допомогою тригера

pic

Якщо ви працювали з 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 set
updated_at();

Тепер кожне оновлення рядка в таблиці users автоматично оновлюватиме поле updated_at.

Практичний приклад

INSERT INTO users (name) VALUES ('John Doe');
-- updatedat встановлюється на поточний час
UPDATE users SET name = 'John Doe Jr.' WHERE id = 1;
-- updated
at оновлюється автоматично через тригер

Порада на бонус: Багаторазове використання

Функцію set_updated_at() можна використовувати для кількох таблиць. Просто створіть новий тригер для кожної таблиці та прив’яжіть його до тієї ж функції.

Висновок

Хоча PostgreSQL не має вбудованої функції ON UPDATE CURRENT_TIMESTAMP, як MySQL, таку поведінку легко реалізувати через тригер. Це чисте, ефективне та багаторазове рішення, яке чудово працює в реальних застосунках.

Сподіваюся, стаття була корисною. Якщо у вас є питання або пропозиції, не соромтесь коментувати або зв'язатися зі мною.

Стежте за мною на LinkedIn

Перекладено з: How to Simulate ON UPDATE CURRENT_TIMESTAMP from MySQL in PostgreSQL Using a Trigger