Before Insert Trigger trong MySQL
Trong bài này mình ta sẽ tìm hiểu Before Insert Trigger trong MySQL, thông qua đó bạn sẽ nắm rõ hơn cách tao một trigger xử lý trước khi insert dữ liệu vào database.
1. Tìm hiểu Before Insert Trigger trong MySQL
Giống như tên gọi của nó, đây là loại trigger sẽ được gọi trước khi insert dữ liệu vào table, điều này khác hoàn toàn với After Trigger.
Cú pháp dưới đây giúp bạn tạo ra loại trigger này:
CREATE TRIGGER trigger_name BEFORE INSERT ON table_name FOR EACH ROW trigger_body;
Về cú pháp cơ bản thì chúng ta đã được học ở bài trước, riêng bài này thì công thức xác định rõ là loại BEFORE INSERT
.
Bài viết này được đăng tại [free tuts .net]
Nếu trong trigger của bạn có nhiều câu lệnh SQL thì phải đặt nó trong cặp BEGIN .. END
nhé.
DELIMITER $$ CREATE TRIGGER trigger_name BEFORE INSERT ON table_name FOR EACH ROW BEGIN -- statements END$$ DELIMITER ;
Lưu ý rằng trong loại trigger này bạn có thể truy cập lấy dữ liệu mới, nhưng riêng dữ liệu cũ là không được bởi vì bản chất nó chưa đụng gì tới dữ liệu cũ nên không được lưu vết. Tức là dùng NEW.field_name
thì được, OLD.field_name
là không được.
2. Ví dụ Before Insert Trigger trong MySQL
Chúng ta sẽ tạo một before insert trigger để ...
Tạo database
Đầu tiên mình tạo một table có tên là WorkCenters
như sau:
DROP TABLE IF EXISTS WorkCenters; CREATE TABLE WorkCenters ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, capacity INT NOT NULL );
Tiếp theo mình tạo một bảng WorkCenterStats
để lưu trữ tổng công suất làm việc.
DROP TABLE IF EXISTS WorkCenterStats; CREATE TABLE WorkCenterStats( totalCapacity INT NOT NULL );
Tạo Trigger
Bây giờ mình tạo một before insert trigger, khi thêm một dữ liệu mới vào table WorkCenterStats
thì sẽ cập nhật tổng công suất làm việc.
DELIMITER $$ CREATE TRIGGER before_workcenters_insert BEFORE INSERT ON WorkCenters FOR EACH ROW BEGIN DECLARE rowcount INT; SELECT COUNT(*) INTO rowcount FROM WorkCenterStats; IF rowcount > 0 THEN UPDATE WorkCenterStats SET totalCapacity = totalCapacity + new.capacity; ELSE INSERT INTO WorkCenterStats(totalCapacity) VALUES(new.capacity); END IF; END $$ DELIMITER ;
Đoạn code trên xảy ra hai trường hợp:
Nếu thêm vào lần đầu tiên thì ta phải sử dụng lệnh insert, lúc này capacity chính là giá trị nhập vào luôn.
INSERT INTO WorkCenterStats(totalCapacity) VALUES(new.capacity);
Nếu thêm vào các lần tiếp theo thì ta update cộng dồn capacity lên.
UPDATE WorkCenterStats SET totalCapacity = totalCapacity + new.capacity;
Test trigger
Bây giờ hãy thử insert một vài dòng dữ liệu vào để xem trigger có hoạt động không nhé.
Đầu tiên mình chạy lệnh thêm dữ liệu như sau:
INSERT INTO WorkCenters(name, capacity) VALUES('Mold Machine',100);
Tiếp theo truy vấn vào table WorkCenterStats
xem có gì trong đó không.
SELECT * FROM WorkCenterStats;
Tuyệt vời, dữ liệu đã tự động thêm vào.
Hãy thử insert thêm một dòng dữ liệu nữa nhé.
INSERT INTO WorkCenters(name, capacity) VALUES('Packing',200);
Chạy câu lệnh này xong thì totalCapacity
phải có giá trị 300. Và đúng như thế thật.
Như vậy là trigger đã hoạt động đúng. Đây là các bước test quan trọng để kiểm tra trigger có hoạt động tốt hay không.
Trên là cách tạo before insert trigger trong MySQL. Nội dung khá đơn giản, bạn chỉ việc làm theo từng bước là sẽ hiểu được bài. Chúc bạn thực hiện thành công!