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

After Update Trigger trong MySQL

Trong bài này bạn sẽ học cách tạo After Update Trigger trong MySQL, đây là loại trigger được gọi sau khi lệnh update hoàn thành, vì vậy bạn có thể truy cập OLD và NEW nhưng không thay đổi được giá trị của chúng.

Về cách hoạt động thì không khác gì lệnh After Insert, điểm khác duy nhất là một bên là INSERT TRIGGER và một bên là UPDATE TRIGGER.

Mục lục

  • 1. Cú pháp After Update Trigger trong MySQL
  • 2. Ví dụ After Update Trigger trong MySQL
    • Tạo table sale
    • Tạo trigger
    • Thử trigger

1. Cú pháp After Update Trigger trong MySQL

Như thường lệ, bạn phải hiểu rằng đây là loại trigger hoạt động sau khi lệnh update thực hiện xong.

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
AFTER UPDATE
ON table_name FOR EACH ROW
trigger_body

MySQL nhận biết đây là loại AFTER UPDATE trigger thông qua từ khóa này.

Về phần trigger body bạn nên đặt trong thẻ BEGIN .. END để tường minh, vì dù sao body nếu có nhiều lệnh SQL thì đó là điều bắt buộc.

1
2
3
4
5
6
7
8
9
10
DELIMITER $$
 
CREATE TRIGGER trigger_name
    AFTER UPDATE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$   
 
DELIMITER ;

Như mình đã nói ở trên, bạn có thể truy xuất đến giá trị của OLD và NEW nhưng không thể cập nhật được, vì MySQL đã thực hiện update xong mới gọi đến trigger này.

MySQL AFTER UPDATE Trigger png

2. Ví dụ After Update Trigger trong MySQL

Hãy xem ví dụ dưới đây, chúng ta vẫn làm việc với bảng sales như ở bài trước. Hãy chạy lệnh SQL này để tạo bảng.

Tạo table sale

Dưới đây là cấu trúc của bảng Sales.

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 hãy insert 3 dòng dữ liệu vào, khác hoàn toàn với bài trước.

1
2
3
4
5
INSERT INTO Sales(product, quantity, fiscalYear, fiscalMonth)
VALUES
    ('2001 Ferrari Enzo',140, 2021,1),
    ('1998 Chrysler Plymouth Prowler', 110,2021,1),
    ('1913 Ford Model T Speedster', 120,2021,1);

Nào, bây giờ hãy sử dụng lệnh Select để xem trong bảng có gì nhé.

1
SELECT * FROM Sales;

MySQL AFTER UPDATE trigger sample table png

Tạo thêm một table SalesChanges để lưu trữ thông tin cập nhật của bảng sales.

1
2
3
4
5
6
7
8
9
DROP TABLE IF EXISTS SalesChanges;
 
CREATE TABLE SalesChanges (
    id INT AUTO_INCREMENT PRIMARY KEY,
    salesId INT,
    beforeQuantity INT,
    afterQuantity INT,
    changedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

Tạo trigger

Tiếp theo hãy tạo trigger xử lý tình huống sau: Nếu giá trị của quantity cập nhật khác với gí trị cũ thì hãy lưu vết vào table SalesChanges để sau này biết lịch sử thay đổi của nó.

1
2
3
4
5
6
7
8
9
10
11
12
13
DELIMITER $$
 
CREATE TRIGGER after_sales_update
AFTER UPDATE
ON sales FOR EACH ROW
BEGIN
    IF OLD.quantity <> new.quantity THEN
        INSERT INTO SalesChanges(salesId,beforeQuantity, afterQuantity)
        VALUES(old.id, old.quantity, new.quantity);
    END IF;
END$$
 
DELIMITER ;

Về các hàm mình sử dụng ở trên khá quen thuộc với các bạn rồi nên mình không giải thích gì thêm.

Thử trigger

Bây giờ hãy thử update dữ liệu xem trigger có hoạt động không nhé.

Bạn hãy để ý dòng dữ liệu ID = 1 có giá trị của quantity là 140, bây giờ mình sẽ cập nhật nó thành 350.

Nếu như trigger hoạt động đúng thì nó sẽ lưu vết vào bảng SalesChanges.

1
2
3
UPDATE Sales
SET quantity = 350
WHERE id = 1;

Hãy chạy câu SQL trên nhé, sau đó chạy lệnh dưới đây để xem trong bảng SalesChanges có gì không.

1
SELECT * FROM SalesChanges;

MySQL AFTER UPDATE trigger example png

Như vậy là nó đã hoạt động. Bây giờ hãy thử cập nhật tất của quantity tăng lên 10%.

1
2
UPDATE Sales
SET quantity = CAST(quantity * 1.1 AS UNSIGNED);

Xem lại bảng SalesChanges:

1
SELECT * FROM SalesChanges;

MySQL AFTER UPDATE trigger example 2 png

Vùng mình khoanh đỏ chính là ba dòng dữ liệu đã được thêm vào bởi vì mình đã update tăng 10% quantity cho 3 rows trong bảng Sales.

Như vậy là mình đã hướng dẫn xong cách sử dụng After Update Trigger trong MySQL, với loại trigger này sẽ giúp bạn làm được khá nhiều việc, nhất là dùng đẻ lưu vết các table.

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

=============================
After Update Trigger trong MySQL, 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