06/04/2021, 14:50

Lệnh Create Trigger trong MySQL - MySQL nâng cao

Trong bài này bạn sẽ được học cách sử dụng lệnh Create Trigger trong MySQL, với lệnh này bạn có thể dùng để tạo ra một trigger mới bất kì. Nếu bạn chưa biết khái niệm Trigger là gì thì mình có thể nói sơ lược như sau: Trigger là trình kích hoạt, sẽ được kích hoạt khi một tác động nào đó vào nó. ...

Trong bài này bạn sẽ được học cách sử dụng lệnh Create Trigger trong MySQL, với lệnh này bạn có thể dùng để tạo ra một trigger mới bất kì.

Nếu bạn chưa biết khái niệm Trigger là gì thì mình có thể nói sơ lược như sau: Trigger là trình kích hoạt, sẽ được kích hoạt khi một tác động nào đó vào nó.

Trong MySQL Trigger có nghĩa là một đoạn code SQL xử lý một chức năng nào đó, nó hoạt động ngầm và được chạy khi một trong các tác động như Insert / Update / Delete vào table.

Ví dụ: Bạn muốn khi thêm một nhân viên mới thì sẽ gửi 1 tin nhắn đến người dùng. Như vậy bạn sẽ viết trigger vào table employee, khi sự kiện insert xảy ra thì đồng thời nó sẽ thêm luôn một dòng dữ liệu vào bảng message.

1. Cách dùng lệnh Create Trigger trong MySQL

Lênh CREATE TRIGGER sẽ giúp bạn tạo ra một trigger mới, bằng cách sử dụng cú pháp sau:

CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE| DELETE }
ON table_name FOR EACH ROW
trigger_body;

Trong đó:

  • trigger_name là tên của trigger mà bạn muốn đặt.
  • INSERT | UPDATE| DELETE: Mỗi trigger sẽ được gắn cho một trong ba hành động này.
  • BEFORE | AFTER: Nếu bạn chọn Before thì trigger sẽ chạy trước khi hành động xảy ra, ngược lại After là sau hành động xảy ra.
  • ON table_name là table sẽ được gắn trigger này.
  • FOR EACH ROW là sẽ duyệt qua từng row.

Phần trigger_body chính là nội dung xử lý khi xảy ra sự kiện. Ta sẽ dựa vào hai biến tạm là OLD và NEW để biết đâu là dữ liệu cũ va đâu là dữ liệu mới.

Ví dụ: Khi cập nhật thông tin khách hàng thì lưu thông tin cũ vào một table backup. Lúc này để lấy thông tin cũ thì bạn sử dụng OLD.ten_field, còn thông tin mới chuẩn bị update là NEW.ten_field.

Tham khảo bảng mô tả dưới đây để biết được khi nào thì hai biến đó tồn tại.

2. Ví dụ tạo Trigger trong MySQL

Trigger nói chung không khó nếu bạn hiểu bản chất của nó. Và đương nhiên để học được thì bạn phải tìm hiểu qua Procedure.

Bước 1: Hãy tạo một table employees có cấu trúc như sau.

employees png

Sau đó bạn tạo thêm một table tên là employees_audit, table này chứa thông tin cũ mà bạn đã cập nhật cho khách hàng.

CREATE TABLE employees_audit (
    id INT AUTO_INCREMENT PRIMARY KEY,
    employeeNumber INT NOT NULL,
    lastname VARCHAR(50) NOT NULL,
    changedat DATETIME DEFAULT NULL,
    action VARCHAR(50) DEFAULT NULL
);

Bây giờ mình sẽ tạo một Trigger như sau:

  • Đặt tên là before_employee_update.
  • Chọn cách hoạt động là BEFORE UPDATE.
  • Gắn vào bảng employees.
EATE TRIGGER before_employee_update 
    BEFORE UPDATE ON employees
    FOR EACH ROW 
 INSERT INTO employees_audit
 SET action = 'update',
     employeeNumber = OLD.employeeNumber,
     lastname = OLD.lastname,
     changedat = NOW();

Như bạn thấy, mình sử dụng OLD.lastnameOLD.employeeNumber để lấy thông tin cũ trong table employees.

Chạy lệnh này xong mình dùng lệnh SHOW TRIGGERS để xem trong hệ thóng có không.

SHOW TRIGGERS;

MySQL CREATE TRIGGER show triggers png

Ngoài ra, nếu bạn xem lược đồ bằng MySQL Workbench thì chọn employees > triggers bạn sẽ thấy trigger before_employee_update như trong ảnh chụp màn hình bên dưới:

MySQL create trigger example jpg

Sau đó hãy thử cập nhật một row bất kì trong table employees.

UPDATE employees 
SET 
    lastName = 'Phan'
WHERE
    employeeNumber = 1056;

Cuối cùng, truy vấn bảng employees_audit để kiểm tra xem kích hoạt có được kích hoạt bởi câu lệnh UPDATE không:

SELECT * FROM employees_audit;

Kết quả đã xuất hiện một dòng dữ liệu trong bảng này, mặc dù mình không hề chạy lệnh insert trên nó.

MySQL CREATE TRIGGER example 20 result png

Như vậy là bạn đã tạo và chạy thử thành công một trigger trong MySQL. Với trigger này thì sau này mỗi khi bạn update bảng employees thì sẽ xuất hiện một dòng data mới trong bảng employees_audit.

Bùi Văn Nam

27 chủ đề

7090 bài viết

Cùng chủ đề
0