Thời gian đọc: 9 phút
Trigger trong MySQL là một cơ chế tự động thực hiện một tập các câu lệnh SQL khi có một sự kiện cụ thể xảy ra trong cơ sở dữ liệu, chẳng hạn như thêm, cập nhật, hoặc xóa dữ liệu. Nó giúp bạn tự động hóa các quy trình, bảo vệ tính toàn vẹn dữ liệu, và thực hiện các thao tác phức tạp mà không cần can thiệp thủ công.
INSERT
, UPDATE
, hoặc DELETE
. Trigger có thể được thiết lập để kích hoạt trước hoặc sau khi sự kiện xảy ra:
UPDATE
, INSERT
, DELETE
, hoặc gọi đến các thủ tục.Cú pháp để tạo một trigger trong MySQL:
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
-- Câu lệnh SQL thực thi khi trigger được kích hoạt
END;
Giả sử bạn có một bảng orders
và bạn muốn ghi lại lịch sử các đơn hàng vào bảng order_history
mỗi khi có đơn hàng mới được thêm vào bảng orders
:
CREATE TRIGGER after_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_history (order_id, product_id, quantity, created_at)
VALUES (NEW.order_id, NEW.product_id, NEW.quantity, NOW());
END;
orders
.orders
.COMMIT
hoặc ROLLBACK
.Trigger giúp bạn tự động hóa các tác vụ lặp lại, đảm bảo tính toàn vẹn dữ liệu và dễ dàng quản lý sự phức tạp trong hệ thống cơ sở dữ liệu.
Dưới đây là các ví dụ chi tiết về Trigger trong MySQL, bao gồm các loại trigger khác nhau như BEFORE INSERT
, AFTER INSERT
, BEFORE UPDATE
, AFTER UPDATE
, BEFORE DELETE
, và AFTER DELETE
. Những ví dụ này sẽ giúp bạn hiểu rõ hơn cách sử dụng trigger trong các tình huống thực tế.
BEFORE INSERT
Trigger BEFORE INSERT
được kích hoạt trước khi một bản ghi mới được chèn vào bảng. Trigger này có thể được sử dụng để thực hiện kiểm tra hoặc thay đổi dữ liệu trước khi chèn.
Khi một người dùng đăng ký mới, ta muốn tự động điền giá trị mặc định cho trường created_at
nếu người dùng không cung cấp.
CREATE TRIGGER before_user_insert
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
IF NEW.created_at IS NULL THEN
SET NEW.created_at = NOW();
END IF;
END;
created_at
chưa được cung cấp, nó sẽ được gán giá trị hiện tại bằng NOW()
.AFTER INSERT
Trigger AFTER INSERT
được kích hoạt sau khi một bản ghi mới đã được chèn vào bảng. Trigger này thường dùng để cập nhật hoặc ghi lại các thay đổi trong một bảng khác.
Khi một đơn hàng mới được tạo, chúng ta sẽ thêm một bản ghi vào bảng order_history
để theo dõi lịch sử của các đơn hàng.
CREATE TRIGGER after_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_history (order_id, product_id, quantity, created_at)
VALUES (NEW.order_id, NEW.product_id, NEW.quantity, NOW());
END;
orders
, dữ liệu đơn hàng sẽ được ghi lại vào bảng order_history
.BEFORE UPDATE
Trigger BEFORE UPDATE
được kích hoạt trước khi một bản ghi được cập nhật. Nó có thể được sử dụng để kiểm tra hoặc thay đổi dữ liệu trước khi bản ghi thực sự được cập nhật.
Trong hệ thống quản lý nhân viên, nếu cập nhật mức lương của nhân viên, bạn muốn đảm bảo rằng mức lương không được giảm xuống dưới mức lương hiện tại.
CREATE TRIGGER before_employee_update
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
IF NEW.salary < OLD.salary THEN
SET NEW.salary = OLD.salary; -- Ngăn chặn giảm lương
END IF;
END;
NEW.salary: Giá trị lương mới được cập nhật.
OLD.salary: Giá trị lương hiện tại trước khi cập nhật.
AFTER UPDATE
Trigger AFTER UPDATE
được kích hoạt sau khi một bản ghi được cập nhật. Trigger này có thể được sử dụng để ghi nhật ký hoặc thực hiện các thay đổi bổ sung dựa trên việc cập nhật.
Khi cập nhật thông tin đơn hàng, chúng ta sẽ ghi lại những thay đổi vào bảng order_history
.
CREATE TRIGGER after_order_update
AFTER UPDATE ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_history (order_id, product_id, quantity, updated_at)
VALUES (NEW.order_id, NEW.product_id, NEW.quantity, NOW());
END;
order_history
sau khi đơn hàng được cập nhật.BEFORE DELETE
Trigger BEFORE DELETE
được kích hoạt trước khi một bản ghi bị xóa. Nó có thể được sử dụng để kiểm tra hoặc thực hiện các tác vụ trước khi dữ liệu bị xóa.
Trước khi xóa một tài khoản người dùng, chúng ta muốn ghi lại thông tin của người dùng đó vào bảng deleted_users
.
CREATE TRIGGER before_user_delete
BEFORE DELETE ON users
FOR EACH ROW
BEGIN
INSERT INTO deleted_users (user_id, name, email, deleted_at)
VALUES (OLD.user_id, OLD.name, OLD.email, NOW());
END;
deleted_users
trước khi bị xóa khỏi bảng users
.AFTER DELETE
Trigger AFTER DELETE
được kích hoạt sau khi một bản ghi bị xóa. Nó có thể được sử dụng để ghi nhật ký hoặc thực hiện các hành động bổ sung sau khi dữ liệu đã bị xóa.
Khi xóa một đơn hàng khỏi bảng orders
, chúng ta sẽ xóa luôn các mục tương ứng trong bảng order_items
.
CREATE TRIGGER after_order_delete
AFTER DELETE ON orders
FOR EACH ROW
BEGIN
DELETE FROM order_items WHERE order_id = OLD.order_id;
END;
orders
, các mục tương ứng trong bảng order_items
cũng sẽ bị xóa theo.BEFORE INSERT
với kiểm tra điều kiệnTrigger này có thể dùng để kiểm tra dữ liệu đầu vào trước khi chèn. Ví dụ, bạn muốn đảm bảo rằng không ai có thể đăng ký người dùng với tuổi nhỏ hơn 18.
CREATE TRIGGER before_user_insert_check_age
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
IF NEW.age < 18 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Age must be 18 or older!';
END IF;
END;
AFTER INSERT
với tự động cập nhật giá trịSau khi thêm một đơn hàng mới, hệ thống sẽ tự động cập nhật tổng số lượng hàng tồn kho cho sản phẩm.
CREATE TRIGGER after_order_insert_update_stock
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
UPDATE products
SET stock = stock - NEW.quantity
WHERE product_id = NEW.product_id;
END;
Các Trigger trong MySQL giúp bạn tự động hóa nhiều quy trình quản lý cơ sở dữ liệu phức tạp, bảo đảm tính toàn vẹn dữ liệu và tự động thực hiện các tác vụ cần thiết khi có sự thay đổi trong bảng. Tùy thuộc vào nhu cầu, bạn có thể chọn loại trigger phù hợp (BEFORE/AFTER INSERT, UPDATE, DELETE) để đảm bảo hoạt động tối ưu.