Thứ Tư, 26 tháng 7, 2023

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ì.

Mục lục

  • 1. Cú pháp Before Update Trigger trong MySQL
  • 2. Ví dụ Before Update Trigger trong MySQL
    • Tạo database
    • Tạo Before Update trigger
    • Thử nghiệm Trigger

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 [tranvanbinh.vn]

1
2
3
4
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é.

1
2
3
4
5
6
7
8
9
10
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é.

MySQL BEFORE UPDATE Trigger png

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.

1
2
3
4
5
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é.

1
SELECT * FROM sales;

MySQL BEFORE UPDATE trigger Sample Table png

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".

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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.

1
2
3
4
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ề.

1
2
3
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é.

1
2
3
UPDATE sales
SET quantity = 500
WHERE id = 1;

Bạn sẽ nhận được thông báo lỗi như sau:

1
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.

=============================
* 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

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master