Якщо ви працювали з 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 setupdated_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