Before Update Trigger trong MySQL
Trong bài này chúng ta sẽ học về Before Update Trigger trong MySQL, đây là loại trigger có tác dụng trước khi bạn update một row nào đó trong database.
Về quy tắc hoạt động thì nó không khác gì before insert cả, nên nếu bạn hiểu bài đó rồi thì học bài này sẽ không có chút khó khăn gì.
1. Cú pháp Before Update Trigger trong MySQL
MySQL BEFORE UPDATE
Trigger sẽ được tự động gọi khi bạn thực hiện một hành động update các row trong table. Trigger sẽ chạy trước rồi mới update nên bạn hoàn toàn có thể thay đổi dữ liệu truyền vào.
Cú pháp của nó như sau:
Bài viết này được đăng tại [free tuts .net]
CREATE TRIGGER trigger_name BEFORE UPDATE ON table_name FOR EACH ROW trigger_body
Trong đó lệnh BEFORE UPDATE
thông báo cho MySQL biết là đang muốn tạo trigger kiểu BEFORE UPDATE
.
Về phần trigger body nếu bạn có nhiều câu lệnh trong đó thì phải đặt trong cặp BEGIN .. END
nhé.
DELIMITER $$ CREATE TRIGGER trigger_name BEFORE UPDATE ON table_name FOR EACH ROW BEGIN -- statements END$$ DELIMITER ;
Trong loại BEFORE UPDATE
trigger bạn có thể thay đổi dữ liệu cho NEW nhưng không thể thay đổi dữ liệu của OLD nhé.
2. Ví dụ Before Update Trigger trong MySQL
Không có gì dễ hiểu bằng một ví dụ. Hãy cùng mình làm một chức năng nhỏ nhé.
Tạo database
Đầu tiên hãy tạo một table có tên là sales, cấu trúc như sau:
DROP TABLE IF EXISTS sales; CREATE TABLE sales ( id INT AUTO_INCREMENT, product VARCHAR(100) NOT NULL, quantity INT NOT NULL DEFAULT 0, fiscalYear SMALLINT NOT NULL, fiscalMonth TINYINT NOT NULL, CHECK(fiscalMonth >= 1 AND fiscalMonth <= 12), CHECK(fiscalYear BETWEEN 2000 and 2050), CHECK (quantity >=0), UNIQUE(product, fiscalYear, fiscalMonth), PRIMARY KEY(id) );
Tiếp theo mình sẽ thêm một vài dòng dữ liệu để sau này thử nghiệm trigger bằng lệnh update.
INSERT INTO sales(product, quantity, fiscalYear, fiscalMonth) VALUES ('2003 Harley-Davidson Eagle Drag Bike',120, 2020,1), ('1969 Corvair Monza', 150,2020,1), ('1970 Plymouth Hemi Cuda', 200,2020,1);
Để chắc ăn thì hãy kiểm tra trong table sales đã có dữ liệu chưa nhé.
SELECT * FROM sales;
Tạo Before Update trigger
Mình sẽ viết một trigger bắt sự kiện update, kiểm tra nếu quantity
update lớn gấp 3 lần hiện tại thì thông báo lỗi "cannot be 3 times greater than the current quantity".
DELIMITER $$ CREATE TRIGGER before_sales_update BEFORE UPDATE ON sales FOR EACH ROW BEGIN DECLARE errorMessage VARCHAR(255); SET errorMessage = CONCAT('The new quantity ', NEW.quantity, ' cannot be 3 times greater than the current quantity ', OLD.quantity); IF new.quantity > old.quantity * 3 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = errorMessage; END IF; END $$ DELIMITER ;
Trong lệnh SQL trên thì bạn chú ý một số điểm như sau:
Mình đã đặt tên cho trigger là before_sales_update
, gắn vào table sales
. Vì có nhiều lệnh bên trong nên đặt trong cặp BEGIN .. END
.
Đoạn code dưới đây là khai báo một biến thông báo lỗi.
SET errorMessage = CONCAT('The new quantity ', NEW.quantity, ' cannot be 3 times greater than the current quantity ', OLD.quantity);
Đoạn code dưới đây kiểm tra nếu giá trị nhập vào (NEW) gấp 3 lần hiện tại (OLD) thì gán lỗi và trả kết quả về.
IF new.quantity > old.quantity * 3 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = errorMessage;
Thử nghiệm Trigger
Bây giờ hãy thử nghiệm xem trigger hoạt động có đúng không nhé.
Bạn hãy để ý dòng dữ liệu thứ nhất có quanlity
là 150. Bây giờ mình thử update nó lên 500 xem có xuất hiện lỗi không nhé.
UPDATE sales SET quantity = 500 WHERE id = 1;
Bạn sẽ nhận được thông báo lỗi như sau:
Error Code: 1644. The new quantity 500 cannot be 3 times greater than the current quantity 150
Như vậy là mình đã hướng dẫn xong cách sử dụng BEFORE UPDATE trigger trong MySQL. Bạn phải nhớ rằng đây là loại trigger sẽ được gọi đến trước khi thực hiện update nên bạn có thể thay đổi dữ liệu được.