TRIGGER Trong MySQL – Kích Hoạt Tự Động Khi Dữ Liệu Thay Đổi
TRIGGER trong MySQL — một công cụ rất mạnh mẽ cho phép bạn tự động thực thi các câu lệnh SQL khi có thay đổi xảy ra trong bảng (INSERT, UPDATE, DELETE). Đây là tính năng cực kỳ hữu ích để bảo vệ, ghi log, hoặc kiểm soát dữ liệu ngay tại tầng cơ sở dữ liệu.
Mục lục
✅ 1. Trigger là gì?
Triggerlà một khối mã SQL tự động thực thi khi có thao tácINSERT,UPDATE, hoặcDELETExảy ra trên một bảng.- Hoạt động giống như một “người gác cổng”: khi có ai “đụng” vào bảng, trigger sẽ kiểm soát.
✅ 2. Khi nào nên dùng Trigger?
| Tình huống thực tế | Mục đích sử dụng Trigger |
|---|---|
| Ghi log thay đổi dữ liệu | Lưu lịch sử cập nhật, xóa dữ liệu (audit log) |
| Tự động cập nhật trường phụ thuộc | Cập nhật ngày sửa cuối (updated_at), số lượng |
| Kiểm tra logic ràng buộc nâng cao | Ví dụ: không cho xóa nếu đang được dùng |
| Đồng bộ bảng khác | Cập nhật bảng tổng, bảng backup, bảng thống kê… |
✅ 3. Cú pháp tạo Trigger
CREATE TRIGGER ten_trigger
[BEFORE|AFTER] [INSERT|UPDATE|DELETE]
ON ten_bang
FOR EACH ROW
BEGIN
-- câu lệnh SQL
END;
BEFORE= trước khi thực hiện thao tácAFTER= sau khi thao tác hoàn tất
✅ 4. Ví dụ: Ghi log khi thêm sinh viên
🧪 Bảng chính và bảng log:
CREATE TABLE Students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE StudentLog (
log_id INT AUTO_INCREMENT PRIMARY KEY,
student_name VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
🔔 Tạo trigger khi thêm sinh viên:
DELIMITER $$
CREATE TRIGGER trg_log_insert_student
AFTER INSERT ON Students
FOR EACH ROW
BEGIN
INSERT INTO StudentLog(student_name)
VALUES (NEW.name);
END$$
DELIMITER ;
✅ Kiểm tra:
INSERT INTO Students(name) VALUES ('Toan');
SELECT * FROM StudentLog;
→ Tự động ghi log "Toan" vào bảng StudentLog.
✅ 5. Trigger với UPDATE
DELIMITER $$
CREATE TRIGGER trg_update_log
BEFORE UPDATE ON Students
FOR EACH ROW
BEGIN
INSERT INTO StudentLog(student_name)
VALUES (CONCAT('Updated from ', OLD.name, ' to ', NEW.name));
END$$
DELIMITER ;
✅ 6. Trigger với DELETE
DELIMITER $$
CREATE TRIGGER trg_delete_log
AFTER DELETE ON Students
FOR EACH ROW
BEGIN
INSERT INTO StudentLog(student_name)
VALUES (CONCAT('Deleted: ', OLD.name));
END$$
DELIMITER ;
✅ 7. Các biến đặc biệt trong Trigger
| Biến | Dùng khi… | Ý nghĩa |
|---|---|---|
NEW.col | INSERT, UPDATE | Giá trị mới được thêm hoặc cập nhật |
OLD.col | UPDATE, DELETE | Giá trị cũ trước khi thay đổi |
✅ 8. Quản lý Trigger
Xem trigger:
SHOW TRIGGERS;
Xóa trigger:
DROP TRIGGER IF EXISTS trg_log_insert_student;
✅ 9. Lưu ý khi dùng Trigger
| Lưu ý | Mô tả |
|---|---|
| ✅ Hoạt động tự động, không cần gọi thủ công | |
❌ Không cho phép CALL procedure có tham số động | |
| ✅ Nên giữ trigger ngắn gọn và hiệu quả | Tránh gây chậm hệ thống |
❌ Không hỗ trợ SELECT trả kết quả trực tiếp | Chỉ dùng SELECT INTO, không dùng SELECT * |
| ✅ Trigger không thể tự gọi chính nó (vòng lặp vô hạn sẽ bị chặn) |
📘 Kết Luận
Triggergiúp bạn tự động hóa hành vi khi bảng bị tác động.- Dùng để ghi log, kiểm soát dữ liệu, đồng bộ bảng phụ, hoặc tăng tính toàn vẹn nghiệp vụ.
- Hãy sử dụng hợp lý để tránh làm chậm hiệu suất hoặc tạo vòng lặp logic không mong muốn.






1 Comments