VIEW
STORED PROCEDURE
INDEX
FULL TEXT SEARCH
TRIGGER
TIPS
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
Dự án mới của mình là gamehow.net, mời anh em ghé thăm và góp ý ạ.

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

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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:

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

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:

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;

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

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.

Cùng chuyên mục:

Hàm ENCRYPT trong MySQL

Hàm ENCRYPT trong MySQL

Cách sử dụng ENCRYPT trong MySQL

Hàm MD5 trong MySQL

Hàm MD5 trong MySQL

Cách sử dụng MD5 trong MySQL

Hàm OLD_PASSWORD trong MySQL

Hàm OLD_PASSWORD trong MySQL

Cách sử dụng OLD_PASSWORD trong MySQL

Hàm PASSWORD trong MySQL

Hàm PASSWORD trong MySQL

Cách sử dụng PASSWORD trong MySQL

Hàm ASCII trong MySQL

Hàm ASCII trong MySQL

Cách sử dụng ASCII trong MySQL

Hàm CHAR_LENGTH trong MySQL

Hàm CHAR_LENGTH trong MySQL

Cách sử dụng CHAR_LENGTH trong MySQL

Hàm CHARACTER_LENGTH trong MySQL

Hàm CHARACTER_LENGTH trong MySQL

Cách sử dụng CHARACTER_LENGTH trong MySQL

Hàm CONCAT trong MySQL

Hàm CONCAT trong MySQL

Cách sử dụng CONCAT trong MySQL

Hàm CONCAT_WS trong MySQL

Hàm CONCAT_WS trong MySQL

Cách sử dụng CONCAT_WS trong MySQL

Hàm FIELD trong MySQL

Hàm FIELD trong MySQL

Cách sử dụng FIELD trong MySQL

Hàm FIND_IN_SET trong MySQL

Hàm FIND_IN_SET trong MySQL

Cách sử dụng FIND_IN_SET trong MySQL

Hàm FORMAT trong MySQL

Hàm FORMAT trong MySQL

Cách sử dụng FORMAT trong MySQL

Hàm INSERT trong MySQL

Hàm INSERT trong MySQL

Cách sử dụng INSERT trong MySQL

Hàm INSTR trong MySQL

Hàm INSTR trong MySQL

Cách sử dụng INSTR trong MySQL

Hàm LCASE trong MySQL

Hàm LCASE trong MySQL

Cách sử dụng LCASE trong MySQL

Hàm LEFT trong MySQL

Hàm LEFT trong MySQL

Cách sử dụng LEFT trong MySQL

Hàm LENGTH trong MySQL

Hàm LENGTH trong MySQL

Cách sử dụng LENGTH trong MySQL

Hàm LOCATE trong MySQL

Hàm LOCATE trong MySQL

Cách sử dụng LOCATE trong MySQL

Hàm LOWER trong MySQL

Hàm LOWER trong MySQL

Cách sử dụng LOWER trong MySQL

Hàm LPAD trong MySQL

Hàm LPAD trong MySQL

Cách sử dụng LPAD trong MySQL

Top