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

pic

Якщо ви працювали з MySQL, вам, ймовірно, знайома функція ON UPDATE CURRENT_TIMESTAMP. Вона автоматично оновлює поле типу дата/час кожного разу, коли змінюється рядок у таблиці. Однак у 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 ('João');
-- updated_at буде встановлено на поточний час

UPDATE users SET name = 'João Jr.' WHERE id = 1;
-- updated_at буде автоматично оновлено через тригер

Додаткова порада: Багаторазове використання

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

Висновок

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

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

Перекладено з: Como simular ON UPDATE CURRENT_TIMESTAMP do MySQL no PostgreSQL com Trigger