Триггер

1. Создание таблицы для логов


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)
);
        

2. Общая структура триггера


DELIMITER $$

CREATE TRIGGER имя_триггера
Тип_события (BEFORE/AFTER) + Тип_операции (INSERT/UPDATE/DELETE)
ON имя_таблицы
FOR EACH ROW
BEGIN
  -- Логика триггера
  IF УСЛОВИЕ THEN
    -- Действие
  END IF;
END$$

DELIMITER ;
        

3. Пример триггера


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 ;
        

4. Объяснение ключевых частей

  1. AFTER UPDATE ON orders

    Триггер срабатывает после обновления строки в таблице orders.

  2. FOR EACH ROW

    Работает для каждой обновленной строки.

  3. NEW и OLD
    • NEW — новые значения полей после обновления.
    • OLD — старые значения полей до обновления.
  4. IF NEW.status_order = 'получен' AND OLD.status_order != 'получен'

    Срабатывает только если статус изменился на "получен".

  5. INSERT INTO log_delivery

    Записывает в лог: ID заказа, новый статус и время изменения.

  6. DELIMITER $$

    Позволяет использовать ; внутри тела триггера.

5. Как проверить работу триггера

  1. Обновите статус заказа:
    UPDATE orders SET status_order = 'получен' WHERE id_ord = 1;
  2. Проверьте лог:
    SELECT * FROM log_delivery;

6. Частые ошибки и решения

Ошибка Причина Решение
Error 1415 Триггер содержит SELECT Используйте только INSERT, UPDATE, DELETE
Error 1054 Неверное имя столбца Проверьте, что поле status_order существует в orders
Error 1436 Некорректный тип DATETIME Используйте DATETIME без точности

7. Общий шаблон для любого варианта


-- 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 ;
        
Создатель сайта не утверждает,
что данная шпаргалка действительно верная
Получить помощь