Trigger BEFORE INSERT cho phép gán giá trị mặc định động (như CURDATE(), NOW(), UUID()) cho cột trước khi hàng được ghi vào bảng.
Ví dụ minh họa
Tạo bảng chỉ có cột DueDate:
CREATE TABLE DemoTable1584 (DueDate DATETIME);
Tạo trigger gán ngày hiện tại:
CREATE TRIGGER insertDate BEFORE INSERT ON DemoTable1584 FOR EACH ROW SET NEW.DueDate = CURDATE();
Chèn hàng không chỉ định giá trị:
INSERT INTO DemoTable1584 VALUES (); INSERT INTO DemoTable1584 VALUES (); INSERT INTO DemoTable1584 VALUES ();
Kết quả (giả sử hôm nay 2019-10-18)
| DueDate |
|---|
| 2019-10-18 00:00:00 |
| 2019-10-18 00:00:00 |
| 2019-10-18 00:00:00 |
Giải thích
BEFORE INSERT: Kích hoạt trước khi hàng được insert.FOR EACH ROW: Chạy cho mỗi hàng (multi-row insert cũng chạy từng hàng).NEW.DueDate: Tham chiếu cột DueDate của hàng mới. Gán giá trị ở đây sẽ ghi vào bảng.CURDATE(): Trả về ngày hiện tại (không có giờ). DùngNOW()cho datetime.
Các trường hợp dùng trigger BEFORE INSERT
- Tự động gán
created_at = NOW(),created_by = USER(). - Tạo UUID/ID tùy chỉnh:
SET NEW.id = UUID(). - Validate/Chuẩn hóa dữ liệu:
SET NEW.email = LOWER(TRIM(NEW.email)). - Tính toán trường dẫn xuất:
SET NEW.total = NEW.qty * NEW.price.
Lưu ý
- Trigger chỉ hoạt động trên bảng cơ sở (không phải VIEW).
- Không thể gọi stored procedure có transaction commit/rollback bên trong trigger.
- MySQL 8.0+: Ưu tiên
DEFAULT (CURDATE())cho cột (hơn trigger đơn giản):
CREATE TABLE DemoTable1584 (
DueDate DATETIME DEFAULT (CURDATE())
);