Để xóa trigger an toàn (không báo lỗi nếu trigger không tồn tại), MySQL cung cấp mệnh đề IF EXISTS.
Cú pháp
DROP TRIGGER [IF EXISTS] ten_trigger;
Ví dụ minh họa
1. Kiểm tra trigger hiện có
mysql> SHOW TRIGGERS;
Kết quả:
+-------------+--------+---------------+------------------------------------------------------------------------+--------+------------------------+--------------------------------------------+---------+----------------------+----------------------+--------------------+
| Trigger | Event | Table | Statement | Timing | Created | sql_mode | Definer | character_set_client | collation_connection | Database Collation |
+-------------+--------+---------------+------------------------------------------------------------------------+--------+------------------------+--------------------------------------------+---------+----------------------+----------------------+--------------------+
| CheckSalary | INSERT | employeetable | if new.EmployeeSalary < 1000 then set new.EmployeeSalary = 10000;end if | BEFORE | 2018-12-31 17:33:29.54 | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@% | utf8 | utf8_general_ci | utf8mb4_0900_ai_ci |
+-------------+--------+---------------+------------------------------------------------------------------------+--------+------------------------+--------------------------------------------+---------+----------------------+----------------------+--------------------+
2. Xóa trigger 'CheckSalary' an toàn
mysql> DROP TRIGGER IF EXISTS CheckSalary;
Query OK, 0 rows affected (0.30 sec)
3. Kiểm tra lại
mysql> SHOW TRIGGERS;
Empty set (0.00 sec)
Các trường hợp sử dụng
| Lệnh | Hành vi nếu trigger tồn tại | Hành vi nếu trigger KHÔNG tồn tại |
|---|---|---|
DROP TRIGGER ten_trigger; | Xóa thành công | Báo lỗi: ERROR 1360 (HY000): Trigger does not exist |
DROP TRIGGER IF EXISTS ten_trigger; | Xóa thành công | Thành công (không lỗi), trả về warning |
Ứng dụng trong script migration/deployment
Luôn dùng IF EXISTS trong script tự động để tránh thất bại khi chạy lại:
-- Script migration an toàn
DROP TRIGGER IF EXISTS CheckSalary;
CREATE TRIGGER CheckSalary BEFORE INSERT ON employeetable
FOR EACH ROW
BEGIN
IF NEW.EmployeeSalary < 1000 THEN
SET NEW.EmployeeSalary = 10000;
END IF;
END;
Lưu ý
- Cần quyền
TRIGGERtrên database - Trigger gắn với bảng cụ thể, xóa trigger không ảnh hưởng dữ liệu bảng
- Xem danh sách trigger:
SHOW TRIGGERS;hoặcSELECT * FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'ten_db'; - MySQL không hỗ trợ
DROP TRIGGER IF EXISTS ten_trigger1, ten_trigger2;(mỗi lệnh chỉ xóa 1 trigger)