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.
Mục lục
- 1. Tìm hiểu Before Insert Trigger trong MySQL
- 2. Ví dụ Before Insert Trigger trong MySQL
- Tạo database
- Tạo Trigger
- Test trigger
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:
1 2 3 4 | 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 [tranvanbinh.vn]
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é.
1 2 3 4 5 6 7 8 9 10 | 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:
1 2 3 4 5 6 7 | 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.
1 2 3 4 5 | 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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.
1 2 | 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.
1 2 | 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:
1 2 | 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.
1 | 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é.
1 2 | 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!
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội
=============================
oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty