Hướng dẫn delete trigger mysql - xóa mysql kích hoạt

Trong bài này chúng ta sẽ tìm hiểu Before Delete Trigger trong MySQL, đây là loại trigger sẽ xảy ra trước khi hệ thống thực hiện lệnh DELETE xóa dữ liệu.

Hướng dẫn delete trigger mysql - xóa mysql kích hoạt

Hướng dẫn delete trigger mysql - xóa mysql kích hoạt

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

Nếu bạn đã đọc những bài trước thì bài này quá đơn giản, bởi bản chất hoạt động của trigger là giống nhau, chỉ khác nhau ở sự kiện châm ngòi trigger mà thôi.

.1 Giới thiệu Before Delete Trigger trong MySQL

Before Delete Trigger trong MySQL sẽ được gọi tự động thì bạn chạy câu lệnh delete, và nó sẽ thực hiện trước khi MySQL thực hiên câu lệnh delete đó. trong MySQL sẽ được gọi tự động thì bạn chạy câu lệnh delete, và nó sẽ thực hiện trước khi MySQL thực hiên câu lệnh delete đó.

Dưới đây là cú pháp cơ bản của nó:

CREATE TRIGGER trigger_name
    BEFORE DELETE
    ON table_name FOR EACH ROW
trigger_body

Trong đó

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
0 là tên của trigger mà bạn muốn đặt,
DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
1 là tên của table mà bạn gắn trigger này.

Bài viết này được đăng tại [free tuts .net]

Riêng

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
2 chính là nội dung xử lý quan trọng nhất, và nếu có nhiều lệnh thì bạn sẽ đặt trong cặp
DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
3.

DELIMITER $$

CREATE TRIGGER trigger_name
    BEFORE DELETE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$    

Trong trigger này bạn có thể truy cập đến các giá trị

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
4 nhưng không thể thay đổi chúng. Riêng
DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
5 thì không có bởi vì ta đang thực hiện câu lệnh Delete.

Hướng dẫn delete trigger mysql - xóa mysql kích hoạt

2. Ví dụ Before Delete Trigger trong MySQL

Hãy thực hành một ví dụ về Before Delete Trigger bạn sẽ thấy dễ hiểu hơn.

Tạo table

Đầu tiên hãy tạo table

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
6 lưu trữ thông tin lương của các nhân viên.

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);

Tiếp theo hãy thêm một vai dòng dữ liệu để qua phần tiếp theo kiểm thử trigger.

INSERT INTO salaries(employeeNumber,validFrom,amount)
VALUES
    (1002,'2000-01-01',50000),
    (1056,'2000-01-01',60000),
    (1076,'2000-01-01',70000);

Bây giờ hãy tạo thêm bảng

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
7 dùng để lưu trữ lịch sử mức lương của nhân viên đã bị xóa.

DROP TABLE IF EXISTS SalaryArchives;    

CREATE TABLE SalaryArchives (
    id INT PRIMARY KEY AUTO_INCREMENT,
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0,
    deletedAt TIMESTAMP DEFAULT NOW()
);

Tạo trigger

Chương trình Trigger dưới đây sẽ thêm một dòng cần xóa vào bảng

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
7.

DELIMITER $$

CREATE TRIGGER before_salaries_delete
BEFORE DELETE
ON salaries FOR EACH ROW
BEGIN
    INSERT INTO SalaryArchives(employeeNumber,validFrom,amount)
    VALUES(OLD.employeeNumber,OLD.validFrom,OLD.amount);
END$$    

DELIMITER ;

Tên của trigger là

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
9, dòng BEFORE DELETE cho thấy đây là loại Before Delete Trigger. Dòng
INSERT INTO salaries(employeeNumber,validFrom,amount)
VALUES
    (1002,'2000-01-01',50000),
    (1056,'2000-01-01',60000),
    (1076,'2000-01-01',70000);
0 khai báo trigger sẽ hoạt động trên table này.

Kiểm tra trigger

Ta hãy chạy một câu lệnh delete để xem có dòng nào được tự động thêm trong bảng

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
7 không nhé.

DELETE FROM salaries 
WHERE employeeNumber = 1002;

Hãy chạy câu Select để xem dữ liệu thế nào.

SELECT * FROM SalaryArchives;   

Hướng dẫn delete trigger mysql - xóa mysql kích hoạt

Trigger

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
9 đã tự động gọi nên nhân viên có ID là 1002 được thêm vào bảng này.

Bây giò ta hãy xóa hai dòng còn lại bằng cách chạy câu SQL Delete tất cả.

Nếu như trigger hoạt động ổn định thì sẽ xuất hiện thêm 2 dòng nữa trong bảng SalaryArchives. Cùng xem kết quả thế nào nhé.

SELECT * FROM SalaryArchives;

Hướng dẫn delete trigger mysql - xóa mysql kích hoạt

Trigger đã hoạt động thêm hai lần vì lệnh Delete ở trên đã thực hiện xóa 2 lần.

Như vậy là mình đã hướng dẫn xong cách sử dụng Before Delete Trigger trong MySQL, hy vọng bạn hiểu loại trigger này. Bài tiếp theo ta sẽ học về After Delete.

Trong bài này bạn sẽ được học After Delete Trigger trong MySQL, đây là loại trigger xảy ra khi bạn thực hiện lệnh delete, và nó sẽ chạy sau khi hệ thống chạy lênh delete đó thành công.

Hướng dẫn delete trigger mysql - xóa mysql kích hoạt

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

1. Giới thiệu After Delete Trigger trong MySQL

Về công dụng thì nó giống như Before Delete, điểm khác duy nhất là nó hoạt động sau khi lệnh delete hoàn thành, còn before delete thì nó hoạt động trước khi lệnh delete thục hiện.

Cú pháp như sau:

CREATE TRIGGER trigger_name
    AFTER DELETE
    ON table_name FOR EACH ROW
trigger_body;

Trong đó

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
0 là tên của trigger,
DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
1 chính là tên của table mà bạn muốn trigger này gắn vào.

Nếu bạn có nhiều dòng SQL bên trong phần trigger_body thì hãy đặt nó trong cặp

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
3.

Bài viết này được đăng tại [free tuts .net]

DELIMITER $$

CREATE TRIGGER trigger_name
    BEFORE DELETE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$    
0

Tương tự như Before Trigger, bạn có thể truy xuất đến giá trị của OLD nhưng không thể thay đổi chúng. Riêng NEW thì không có bởi vi đây là lệnh delete.

Hướng dẫn delete trigger mysql - xóa mysql kích hoạt

2. Vi dụ After Delete Trigger trong MySQL

Trước tiên hãy tạo một vài table để thực hành.

Tạo table

Hãy tạo một table

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
6 có cấu trúc đơn giản như sau:

DELIMITER $$

CREATE TRIGGER trigger_name
    BEFORE DELETE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$    
1

Nó chỉ có 2 field như sau:

  • INSERT INTO salaries(employeeNumber,validFrom,amount)
    VALUES
        (1002,'2000-01-01',50000),
        (1056,'2000-01-01',60000),
        (1076,'2000-01-01',70000);
    7 là mã số nhân viên
  • INSERT INTO salaries(employeeNumber,validFrom,amount)
    VALUES
        (1002,'2000-01-01',50000),
        (1056,'2000-01-01',60000),
        (1076,'2000-01-01',70000);
    8 là mức lương của nhân viên

Hãy thêm một vài dòng dữ liệu.

DELIMITER $$

CREATE TRIGGER trigger_name
    BEFORE DELETE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$    
2

Bây giờ tạo thêm một table

INSERT INTO salaries(employeeNumber,validFrom,amount)
VALUES
    (1002,'2000-01-01',50000),
    (1056,'2000-01-01',60000),
    (1076,'2000-01-01',70000);
9 dùng để lưu trữ tổng số lương của tất cả nhân viên.

DELIMITER $$

CREATE TRIGGER trigger_name
    BEFORE DELETE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$    
3

Đúng ra ta sẽ tạo After Insert Trigger để bắt sự kiện khi thêm nhân viên thì update tổng số mức lương trong bảng SalaryBudgets, hoặc After Update Trigger cho trường hợp bạn chỉnh mức lương. Vì để bài toán đơn giản hơn nên mình sẽ thêm thủ công như sau:

DELIMITER $$

CREATE TRIGGER trigger_name
    BEFORE DELETE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$    
3

Thử truy vấn xem tổng số lương là bao nhiêu nhé. Nếu đúng ra thì sẽ là 5000 + 7000 + 8000 = 20000.

DELIMITER $$

CREATE TRIGGER trigger_name
    BEFORE DELETE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$    
5

Hướng dẫn delete trigger mysql - xóa mysql kích hoạt

Quá chuẩn!

Tạo trigger

Mình sẽ viết trigger khi xóa một nhân viên trong bảng

DROP TABLE IF EXISTS Salaries;

CREATE TABLE Salaries (
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0
);
6 thì update tổng số mức lương ở bảng
INSERT INTO salaries(employeeNumber,validFrom,amount)
VALUES
    (1002,'2000-01-01',50000),
    (1056,'2000-01-01',60000),
    (1076,'2000-01-01',70000);
9.

DELIMITER $$

CREATE TRIGGER trigger_name
    BEFORE DELETE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$    
6

Rất đơn giản nên mình không giải thích thêm nhé.

Chạy thử trigger

Trước tiên hãy thử xóa một nhân viên có

DROP TABLE IF EXISTS SalaryArchives;    

CREATE TABLE SalaryArchives (
    id INT PRIMARY KEY AUTO_INCREMENT,
    employeeNumber INT PRIMARY KEY,
    validFrom DATE NOT NULL,
    amount DEC(12 , 2 ) NOT NULL DEFAULT 0,
    deletedAt TIMESTAMP DEFAULT NOW()
);
2 xem thế nào nhé.

DELIMITER $$

CREATE TRIGGER trigger_name
    BEFORE DELETE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$    
7

Hãy xem tổng số mức lương ở bảng SalaryBudgets có được update không nhé.

DELIMITER $$

CREATE TRIGGER trigger_name
    BEFORE DELETE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$    
8

Hướng dẫn delete trigger mysql - xóa mysql kích hoạt

Kết quả 15000 là đúng rồi, tại vì nhân viên đã xóa có mức lương là 5000.15000 là đúng rồi, tại vì nhân viên đã xóa có mức lương là 5000.

Bây giờ hãy thử xóa tất cả 2 nhân viên còn lại xem tổng số có update về 0 không nhé.

Xem kết quả thế nào.

DELIMITER $$

CREATE TRIGGER trigger_name
    BEFORE DELETE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$    
9

Bạn hãy thử chạy và xem thành quả nhé, mình chắc chắn nó đã về zero rồi :)

Như vậy là mình đã hướng dẫn xong cách sử dụng After Delete Trigger trong MySQL. Hy vọng bài cuối cùng trong loạt tutorials về trigger này sẽ giúp bạn an tâm hơn về kiến thức của mình.After Delete Trigger trong MySQL. Hy vọng bài cuối cùng trong loạt tutorials về trigger này sẽ giúp bạn an tâm hơn về kiến thức của mình.