CREATE TABLE log_delivery (
id_log INT AUTO_INCREMENT PRIMARY KEY,
id_ord INT NOT NULL,
new_status VARCHAR(50) NOT NULL,
change_time DATETIME NOT NULL,
FOREIGN KEY (id_ord) REFERENCES orders(id_ord)
);
DELIMITER $$
CREATE TRIGGER имя_триггера
Тип_события (BEFORE/AFTER) + Тип_операции (INSERT/UPDATE/DELETE)
ON имя_таблицы
FOR EACH ROW
BEGIN
-- Логика триггера
IF УСЛОВИЕ THEN
-- Действие
END IF;
END$$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER log_status_change
AFTER UPDATE ON orders
FOR EACH ROW
BEGIN
IF NEW.status_order = 'получен' AND OLD.status_order != 'получен' THEN
INSERT INTO log_delivery (id_ord, new_status, change_time)
VALUES (NEW.id_ord, NEW.status_order, NOW());
END IF;
END$$
DELIMITER ;
Триггер срабатывает после обновления строки в таблице orders
.
Работает для каждой обновленной строки.
NEW
— новые значения полей после обновления.OLD
— старые значения полей до обновления.Срабатывает только если статус изменился на "получен".
Записывает в лог: ID заказа, новый статус и время изменения.
Позволяет использовать ;
внутри тела триггера.
UPDATE orders SET status_order = 'получен' WHERE id_ord = 1;
SELECT * FROM log_delivery;
Ошибка | Причина | Решение |
---|---|---|
Error 1415 |
Триггер содержит SELECT |
Используйте только INSERT , UPDATE , DELETE |
Error 1054 |
Неверное имя столбца | Проверьте, что поле status_order существует в orders |
Error 1436 |
Некорректный тип DATETIME |
Используйте DATETIME без точности |
-- 1. Таблица для логов
CREATE TABLE имя_лога (
id_log INT AUTO_INCREMENT PRIMARY KEY,
id_заказа INT NOT NULL,
новый_статус VARCHAR(50) NOT NULL,
время_изменения DATETIME NOT NULL,
FOREIGN KEY (id_заказа) REFERENCES основная_таблица(id_заказа)
);
-- 2. Триггер
DELIMITER $$
CREATE TRIGGER имя_триггера
AFTER UPDATE ON основная_таблица
FOR EACH ROW
BEGIN
IF NEW.поле_статуса = 'целевой_статус' AND OLD.поле_статуса != 'целевой_статус' THEN
INSERT INTO имя_лога (id_заказа, новый_статус, время_изменения)
VALUES (NEW.id_заказа, NEW.поле_статуса, NOW());
END IF;
END$$
DELIMITER ;