

TRIGGER Trong MySQL – Kích Hoạt Tự Động Khi Dữ Liệu Thay Đổi
- 08-07-2025
- Toanngo92
- 0 Comments
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ì?
Trigger
là một khối mã SQL tự động thực thi khi có thao tácINSERT
,UPDATE
, hoặcDELETE
xả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
Trigger
giú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.