Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tự động gán ngày hiện tại khi INSERT với TRIGGER BEFORE INSERT trong MySQL

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ùng NOW() 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())
);