MySQL - Triggers.Before Insert

Chào mừng các bạn, những pháp sư cơ sở dữ liệu tương lai! Hôm nay, chúng ta sẽ khám phá thế giới kỳ diệu của các trigger MySQL, cụ thể là trigger "Before Insert". Đừng lo lắng nếu bạn mới bắt đầu; tôi sẽ hướng dẫn bạn từng bước, như tôi đã làm cho hàng trăm sinh viên trong những năm dạy học của mình. Hãy cùng nhau bắt đầu hành trình thú vị này!

MySQL - Before Insert Trigger

MySQL Before Insert Trigger là gì?

Hãy tưởng tượng bạn là một bảo vệ ở một câu lạc bộ sang trọng. Công việc của bạn là kiểm tra mọi người trước khi họ vào. Đó chính xác là điều mà một trigger Before Insert làm cho cơ sở dữ liệu của bạn! Nó là một người bảo vệ đặc biệt hoạt động ngay trước khi dữ liệu mới được chèn vào bảng.

Điểm chính:

  1. Nó tự động kích hoạt trước một thao tác INSERT.
  2. Nó có thể thay đổi dữ liệu đang được chèn hoặc thậm chí ngăn chặn việc chèn.
  3. Nó là một công cụ mạnh mẽ để duy trì tính toàn vẹn dữ liệu và thực thi các quy tắc kinh doanh.

Bây giờ, hãy xem cách chúng ta có thể tạo và sử dụng các trigger này!

Tạo một trigger Before Insert cơ bản

Hãy bắt đầu với một ví dụ đơn giản. Giả sử chúng ta có một bảng叫做 employees:

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

Bây giờ, hãy tạo một trigger đảm bảo rằng tất cả các nhân viên mới có mức lương tối thiểu là $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 ;

Hãy phân tích này:

  1. DELIMITER //: Đây thay đổi delimiters tạm thời để chúng ta có thể sử dụng semicolons trong trigger.
  2. CREATE TRIGGER before_employee_insert: Chúng ta đang đặt tên cho trigger của mình.
  3. BEFORE INSERT ON employees: Điều này chỉ định khi nào và trên bảng nào trigger nên kích hoạt.
  4. FOR EACH ROW: Trigger sẽ chạy cho mỗi hàng được chèn.
  5. BEGIN ... END: Đây chứa mã thực tế của trigger.
  6. IF NEW.salary < 30000 THEN SET NEW.salary = 30000;: Đây là logic của chúng ta. Nếu lương quá thấp, chúng ta sẽ đặt nó thành mức tối thiểu.
  7. DELIMITER ;: Chúng ta đang thay đổi delimiters trở lại thành semicolon.

Bây giờ, hãy kiểm tra nó:

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

Bạn sẽ thấy rằng lương của John đã được tự động điều chỉnh thành $30,000. Thật kỳ diệu, phải không?

Ví dụ trigger Before Insert nâng cao

Hãy nâng cấp trò chơi của chúng ta với một ví dụ phức tạp hơn. Chúng ta sẽ tạo một trigger:

  1. Tự động đặt ngày tuyển dụng thành hôm nay nếu không được cung cấp.
  2. Đảm bảo rằng tên được viết hoa.
  3. Ghi lại việc chèn vào một bảng audit riêng biệt.

Đầu tiên, hãy tạo một bảng audit:

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

Bây giờ, đây là trigger nâng cao của chúng ta:

DELIMITER //
CREATE TRIGGER before_employee_insert_advanced
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
-- Đặt ngày tuyển dụng thành hôm nay nếu không được cung cấp
IF NEW.hire_date IS NULL THEN
SET NEW.hire_date = CURDATE();
END IF;

-- Chuyển tên thành chữ hoa
SET NEW.name = CONCAT(
UPPER(SUBSTRING(NEW.name, 1, 1)),
LOWER(SUBSTRING(NEW.name FROM 2))
);

-- Ghi lại việc chèn
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 ;

Trigger này đang làm nhiều việc:

  1. Kiểm tra nếu hire_date là NULL và đặt nó thành ngày hiện tại nếu vậy.
  2. Chuyển tên thành chữ hoa sử dụng các hàm chuỗi.
  3. Ghi lại việc chèn vào bảng employee_audit.

Hãy kiểm tra nó:

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

Bạn sẽ thấy rằng tên của Jane bây giờ được viết hoa đúng cách, cô ấy có ngày tuyển dụng, và có một mục nhập trong bảng audit!

Trigger Before Insert bằng chương trình khách hàng

Trong khi chúng ta đã sử dụng dòng lệnh MySQL, bạn cũng có thể tạo và sử dụng trigger thông qua các chương trình khách hàng như MySQL Workbench hoặc phpMyAdmin. Quá trình này tương tự:

  1. Kết nối đến cơ sở dữ liệu của bạn.
  2. Mở một cửa sổ SQL script hoặc query mới.
  3. Dán mã tạo trigger của bạn vào.
  4. Chạy script.

Dưới đây là bảng các phương pháp phổ biến để tạo trigger trong các môi trường khác nhau:

Môi trường Phương pháp
MySQL CLI Gõ hoặc dán mã trigger trực tiếp
MySQL Workbench Sử dụng SQL Editor để viết và chạy mã trigger
phpMyAdmin Điều hướng đến tab 'Triggers' cho bảng và sử dụng GUI hoặc viết SQL
Mã ứng dụng Sử dụng thư viện kết nối cơ sở dữ liệu để thực thi SQL tạo trigger

Nhớ rằng, bất kể phương pháp nào, cú pháp SQL vẫn alike!

Kết luận

Chúc mừng! Bạn đã vừa bước những bước đầu tiên vào thế giới của các trigger MySQL. Chúng ta đã bao gồm các основы, tạo một số trigger mạnh mẽ và thậm chí触及 cách sử dụng chúng trong các môi trường khác nhau.

Khi bạn tiếp tục hành trình cơ sở dữ liệu của mình, hãy nhớ rằng trigger là những người bảo vệ vô hình của dữ liệu của bạn. Họ làm việc không ngừng nghỉ sau hậu trường, đảm bảo rằng dữ liệu của bạn sạch sẽ, nhất quán và tuân thủ các quy tắc kinh doanh của bạn.

Tiếp tục luyện tập, thử nghiệm và quan trọng nhất, hãy vui vẻ với nó! Ai biết được, có lẽ một ngày nào đó bạn sẽ là người dạy một thế hệ mới của những người yêu thích cơ sở dữ liệu về những kỳ diệu của trigger.

Chúc bạn may mắn và các truy vấn của bạn luôn trả về kết quả mà bạn mong đợi!

Credits: Image by storyset