RU (Русский)

MySQL - Триггер перед вставкой

Добро пожаловать, будущие маги баз данных! Сегодня мы окунемся в魔法льный мир триггеров MySQL, Specifically, триггер "Before Insert". Не волнуйтесь, если вы новички; я проведу вас через это шаг за шагом, как я делал это для countless студентов на протяжении многих лет моего преподавания. Давайте начнем это захватывающее путешествие вместе!

MySQL - Before Insert Trigger

Что такое триггер Before Insert в MySQL?

Представьте, что выouncer в модном клубе. Ваша задача - проверять каждого перед тем, как они войдут. Именно это делает триггер Before Insert для вашей базы данных! Это особый страж, который приходит в действие прямо перед тем, как новые данные будут вставлены в таблицу.

Основные моменты:

  1. Он активируется автоматически перед операцией INSERT.
  2. Он может изменять вставляемые данные или даже предотвращать вставку полностью.
  3. Это мощный инструмент для поддержания целостности данных и enforcement бизнес-правил.

Теперь давайте посмотрим, как мы можем создать и использовать эти триггеры!

Создание базового триггера Before Insert

Давайте начнем с простого примера. Предположим, у нас есть таблица под названием employees:

CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
salary DECIMAL(10, 2),
hire_date DATE
);

Теперь создадим триггер, который обеспечивает, чтобы все новые сотрудники имели минимальную зарплату в размере 30 000 долларов:

DELIMITER //
CREATE TRIGGER before_employee_insert
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
IF NEW.salary < 30000 THEN
SET NEW.salary = 30000;
END IF;
END//
DELIMITER ;

Давайте разберем это:

  1. DELIMITER //: Это временно изменяет разделитель, чтобы мы могли использовать точку с запятой внутри нашего триггера.
  2. CREATE TRIGGER before_employee_insert: Мы называем наш триггер.
  3. BEFORE INSERT ON employees: Это specifies, когда и на какой таблице должен активироваться триггер.
  4. FOR EACH ROW: Триггер будет запускаться для каждой строки, которая вставляется.
  5. BEGIN ... END: Это содержит фактический код нашего триггера.
  6. IF NEW.salary < 30000 THEN SET NEW.salary = 30000;: Это наш логик. Если зарплата слишком низка, мы устанавливаем ее на минимальную.
  7. DELIMITER ;: Мы изменяем разделитель обратно на точку с запятой.

Теперь давайте проверим это:

INSERT INTO employees (name, salary, hire_date) VALUES ('John Doe', 25000, '2023-05-01');
SELECT * FROM employees;

Вы увидите, что зарплата Джона автоматически скорректирована до 30 000 долларов. Волшебство, верно?

Продвинутый пример триггера Before Insert

Давайте поднимем планку с более сложным примером. Мы создадим триггер, который:

  1. Автоматически устанавливает дату приема на работу на сегодня, если она не указана.
  2. Обеспечивает, чтобы имя было в стиле заголовка.
  3. Логирует вставку в отдельную таблицу аудита.

Сначала создадим таблицу аудита:

CREATE TABLE employee_audit (
id INT AUTO_INCREMENT PRIMARY KEY,
action VARCHAR(50),
employee_id INT,
old_data TEXT,
new_data TEXT,
changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Теперь наш avanzado триггер:

DELIMITER //
CREATE TRIGGER before_employee_insert_advanced
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
-- Установить дату приема на работу сегодня, если она не указана
IF NEW.hire_date IS NULL THEN
SET NEW.hire_date = CURDATE();
END IF;

-- Преобразовать имя в стиль заголовка
SET NEW.name = CONCAT(
UPPER(SUBSTRING(NEW.name, 1, 1)),
LOWER(SUBSTRING(NEW.name FROM 2))
);

-- Логировать вставку
INSERT INTO employee_audit (action, employee_id, new_data)
VALUES ('INSERT', NEW.id, CONCAT('Name: ', NEW.name, ', Salary: ', NEW.salary, ', Hire Date: ', NEW.hire_date));
END//
DELIMITER ;

Этот триггер делает следующее:

  1. Проверяет, является ли hire_date NULL и устанавливает текущую дату, если да.
  2. Преобразует имя в стиль заголовка с помощью строковых функций.
  3. Логирует вставку в нашу таблицу employee_audit.

Давайте проверим это:

INSERT INTO employees (name, salary) VALUES ('jANE smith', 40000);
SELECT * FROM employees;
SELECT * FROM employee_audit;

Вы увидите, что имя Джейн теперь правильно написано с заглавной буквы, у нее есть дата приема на работу, и есть запись в таблице аудита!

Триггер Before Insert с использованием клиентской программы

Хотя мы использовали командную строку MySQL, вы также можете создавать и использовать триггеры через клиентские программы, такие как MySQL Workbench или phpMyAdmin. Процесс аналогичен:

  1. Подключитесь к своей базе данных.
  2. Откройте новое окно SQL-скрипта или запроса.
  3. Вставьте код создания триггера.
  4. Выполните скрипт.

Вот таблица.common методов для создания триггеров в различных средах:

Окружение Метод
MySQL CLI Введите или вставьте код триггера напрямую
MySQL Workbench Используйте SQL Editor для написания и выполнения кода триггера
phpMyAdmin Перейдите на вкладку 'Triggers' для таблицы и используйте GUI или напишите SQL
Код приложения Используйте библиотеки подключения к базе данных для выполнения SQL для создания триггера

Помните, regardless of the method, SQL-синтаксис остается тем же!

Заключение

Поздравляю! Вы только что сделали свои первые шаги в мир триггеров MySQL. Мы рассмотрели основы, создали мощные триггеры и даже коснулись их использования в различных средах.

Продолжая свое путешествие в мире баз данных, помните, что триггеры - это silent guardians ваших данных. Они работают без устали позади сцены, обеспечивая, чтобы ваши данные оставались чистыми, последовательными и compliant с вашими бизнес-правилами.

Продолжайте практиковаться, экспериментировать и, самое главное, получайте удовольствие! Кто знает? Может быть,有一天 вы станете тем, кто teaches новое поколение энтузиастов баз данных о чудесах триггеров.

Счастливого кодирования, и пусть ваши запросы всегда возвращают ожидаемые результаты!

Credits: Image by storyset