Giải pháp: Trigger BEFORE INSERT
Tạo trigger tự động áp dụng LOWER() trước khi INSERT.
Ví dụ minh họa
Tạo bảng
mysql> CREATE TABLE DemoTable (
StudentSubject TEXT
);
Tạo Trigger
mysql> CREATE TRIGGER lowerCaseOnInsertDemo
-> BEFORE INSERT ON DemoTable
-> FOR EACH ROW
-> SET NEW.StudentSubject = LOWER(NEW.StudentSubject);
Chèn dữ liệu
mysql> INSERT INTO DemoTable VALUES('MOngoDb');
mysql> INSERT INTO DemoTable VALUES('JaVA');
mysql> INSERT INTO DemoTable VALUES('MySqL');
Kết quả: Tự động lowercase
mysql> SELECT * FROM DemoTable; +----------------+ | StudentSubject | +----------------+ | mongodb | | java | | mysql | +----------------+
Giải thích Trigger
BEFORE INSERT: Chạy trước khi dòng được ghiFOR EACH ROW: Chạy cho mỗi dòng INSERTNEW.column: Truy cập giá trị mới (có thể gán lại)LOWER(): Hàm chuyển chữ thường
Mở rộng: Trigger cho UPDATE
CREATE TRIGGER lowerCaseOnUpdateDemo BEFORE UPDATE ON DemoTable FOR EACH ROW SET NEW.StudentSubject = LOWER(NEW.StudentSubject);
Kết hợp INSERT + UPDATE
CREATE TRIGGER lowerCaseOnInsertUpdate BEFORE INSERT ON DemoTable FOR EACH ROW SET NEW.StudentSubject = LOWER(NEW.StudentSubject); CREATE TRIGGER lowerCaseOnUpdate BEFORE UPDATE ON DemoTable FOR EACH ROW SET NEW.StudentSubject = LOWER(NEW.StudentSubject);
Xem và xóa Trigger
SHOW TRIGGERS; DROP TRIGGER IF EXISTS lowerCaseOnInsertDemo;
⚠️ Cân nhắc
| Ưu điểm | Nhược điểm |
|---|---|
| Tự động, không phụ thuộc app | Logic ẩn, khó debug |
| Đảm bảo tính nhất quán | Hiệu năng chút (trigger overhead) |
| Áp dụng cho mọi client | Khó migration (trigger không dump mặc định) |
Thay thế tốt hơn: Application Layer
Xử lý lowercase ở application (PHP, Python, Node.js) trước khi INSERT:
-- PHP
$subject = strtolower($input_subject);
$stmt->bind_param('s', $subject);
→ Rõ ràng, testable, portable, không phụ thuộc DB engine.