MySQL - After Delete Trigger

Xin chào các bạn yêu thích cơ sở dữ liệu! Hôm nay, chúng ta sẽ cùng khám phá thế giới kỳ diệu của các trigger trong MySQL, cụ thể là trigger After Delete. Như một người giáo viên khoa học máy tính gần gũi, tôi rất vui mừng được hướng dẫn các bạn trong hành trình này. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - chúng ta sẽ bắt đầu từ những điều cơ bản và dần nâng cao. Vậy, hãy lấy một tách cà phê (hoặc trà, nếu đó là sở thích của bạn) và cùng bắt đầu nhé!

MySQL - After Delete Trigger

MySQL Trigger là gì?

Trước khi chúng ta nhảy vào trigger After Delete, hãy hiểu trigger là gì trong MySQL. Hãy tưởng tượng bạn có một chú chó trung thành luôn sủa khi ai đó bấm chuông cửa. Trong ví dụ này, chuông cửa là một sự kiện, và tiếng sủa của chú chó là phản ứng tự động đối với sự kiện đó. Tương tự, trong MySQL, một trigger là một phản ứng tự động đối với một sự kiện cụ thể trong cơ sở dữ liệu.

MySQL After Delete Trigger

Bây giờ, hãy tập trung vào ngôi sao của ngày hôm nay - trigger After Delete. Như tên gọi của nó, trigger này sẽ được kích hoạt sau khi một 操作DELETE xảy ra trên một bảng. Nó giống như một đội清洁工 đến dọn dẹp sau một buổi tiệc để mọi thứ được ngăn nắp.

Cú pháp của trigger After Delete

Dưới đây là cú pháp cơ bản để tạo một trigger After Delete:

CREATE TRIGGER trigger_name
AFTER DELETE ON table_name
FOR EACH ROW
BEGIN
-- Thân trigger
END;

Hãy phân tích này:

  1. CREATE TRIGGER trigger_name: Đây là nơi bạn đặt tên cho trigger của mình.
  2. AFTER DELETE ON table_name: Điều này chỉ định rằng trigger nên được kích hoạt sau một 操作DELETE trên bảng được chỉ định.
  3. FOR EACH ROW: Điều này có nghĩa là trigger sẽ thực thi một lần cho mỗi hàng bị ảnh hưởng bởi 操作DELETE.
  4. BEGINEND: Những từ khóa này bao quanh thân của trigger, nơi bạn xác định các hành động cần thực hiện.

Ví dụ 1: Ghi lại các bản ghi bị xóa

Giả sử chúng ta có một bảng students, và chúng ta muốn theo dõi các bản ghi học sinh bị xóa. Chúng ta có thể tạo một bảng deleted_students_log và sử dụng một trigger After Delete để ghi lại các bản ghi bị xóa.

Đầu tiên, hãy tạo các bảng của chúng ta:

CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
grade INT
);

CREATE TABLE deleted_students_log (
id INT,
name VARCHAR(50),
grade INT,
deleted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Bây giờ, hãy tạo trigger After Delete của chúng ta:

DELIMITER //
CREATE TRIGGER log_deleted_student
AFTER DELETE ON students
FOR EACH ROW
BEGIN
INSERT INTO deleted_students_log (id, name, grade)
VALUES (OLD.id, OLD.name, OLD.grade);
END //
DELIMITER ;

Trong trigger này, chúng ta sử dụng từ khóa OLD để truy cập các giá trị của hàng bị xóa. Mỗi khi một học sinh bị xóa khỏi bảng students, thông tin của họ sẽ tự động được ghi lại trong bảng deleted_students_log.

Ví dụ 2: Cập nhật các bảng liên quan

Đôi khi, khi bạn xóa một bản ghi, bạn cần cập nhật các bảng liên quan. Giả sử chúng ta có một bảng classes để theo dõi số lượng học sinh trong mỗi lớp. Khi một học sinh bị xóa, chúng ta muốn giảm số lượng học sinh trong lớp của họ.

Đầu tiên, hãy tạo bảng classes của chúng ta:

CREATE TABLE classes (
id INT PRIMARY KEY,
name VARCHAR(50),
student_count INT DEFAULT 0
);

Bây giờ, hãy sửa đổi bảng students để bao gồm class_id:

ALTER TABLE students
ADD COLUMN class_id INT,
ADD FOREIGN KEY (class_id) REFERENCES classes(id);

Cuối cùng, hãy tạo trigger After Delete để cập nhật student_count trong bảng classes:

DELIMITER //
CREATE TRIGGER update_class_count_after_delete
AFTER DELETE ON students
FOR EACH ROW
BEGIN
UPDATE classes
SET student_count = student_count - 1
WHERE id = OLD.class_id;
END //
DELIMITER ;

Trigger này sẽ tự động giảm student_count trong lớp tương ứng mỗi khi một học sinh bị xóa.

Sử dụng trigger After Delete với một chương trình client

Bây giờ, khi chúng ta đã hiểu cách trigger After Delete hoạt động trong MySQL, hãy xem cách chúng ta có thể tương tác với chúng bằng một chương trình client. Trong ví dụ này, chúng ta sẽ sử dụng Python với thư viện mysql-connector.

Đầu tiên, hãy chắc chắn rằng bạn đã cài đặt mysql-connector. Bạn có thể cài đặt nó bằng pip:

pip install mysql-connector-python

Bây giờ, hãy viết một script Python để minh họa việc sử dụng trigger After Delete:

import mysql.connector

# Kết nối với cơ sở dữ liệu MySQL
db = mysql.connector.connect(
host="localhost",
user="your_username",
password="your_password",
database="your_database_name"
)

cursor = db.cursor()

# Chèn một học sinh
def insert_student(id, name, grade, class_id):
sql = "INSERT INTO students (id, name, grade, class_id) VALUES (%s, %s, %s, %s)"
values = (id, name, grade, class_id)
cursor.execute(sql, values)
db.commit()
print(f"Học sinh {name} đã được chèn thành công.")

# Xóa một học sinh
def delete_student(id):
sql = "DELETE FROM students WHERE id = %s"
value = (id,)
cursor.execute(sql, value)
db.commit()
print(f"Học sinh với ID {id} đã bị xóa thành công.")

# Kiểm tra Nhật ký học sinh bị xóa
def check_deleted_log():
cursor.execute("SELECT * FROM deleted_students_log")
result = cursor.fetchall()
print("Nhật ký học sinh bị xóa:")
for row in result:
print(row)

# Kiểm tra số lượng học sinh trong lớp
def check_class_count(class_id):
sql = "SELECT student_count FROM classes WHERE id = %s"
value = (class_id,)
cursor.execute(sql, value)
result = cursor.fetchone()
print(f"Số lượng học sinh trong lớp {class_id}: {result[0]}")

# Chương trình chính
if __name__ == "__main__":
# Chèn một học sinh
insert_student(1, "Alice", 10, 1)

# Xóa học sinh
delete_student(1)

# Kiểm tra nhật ký học sinh bị xóa
check_deleted_log()

# Kiểm tra số lượng học sinh trong lớp
check_class_count(1)

# Đóng kết nối cơ sở dữ liệu
db.close()

Script này minh họa cách chèn một học sinh, xóa họ và sau đó kiểm tra nhật ký học sinh bị xóa và số lượng học sinh trong lớp. Khi bạn chạy script này, bạn sẽ thấy trigger After Delete hoạt động!

Kết luận

Chúc mừng! Bạn đã chính thức bước vào thế giới của trigger After Delete trong MySQL. Chúng ta đãCovered what triggers are, how to create an After Delete trigger, and even how to interact with them using a Python client program.

Nhớ rằng, trigger là công cụ mạnh mẽ trong quản lý cơ sở dữ liệu, nhưng hãy sử dụng chúng một cách khôn ngoan. Chúng có thể ảnh hưởng đến hiệu suất nếu sử dụng quá nhiều, vì vậy hãy luôn xem xét xem trigger có phải là giải pháp tốt nhất cho trường hợp cụ thể của bạn hay không.

Khi bạn tiếp tục hành trình trong lập trình cơ sở dữ liệu, hãy tiếp tục khám phá và thử nghiệm. Ai biết được? Bạn có thể sẽ kích hoạt niềm đam mê lifelong đối với cơ sở dữ liệu! (Xem tôi đã làm gì đó? Một chút hài hước về cơ sở dữ liệu cho bạn!)

Chúc các bạn lập trình vui vẻ, và hy vọng các truy vấn của bạn luôn chạy mượt mà!

Phương thức Mô tả
CREATE TRIGGER Tạo một trigger mới trong MySQL
AFTER DELETE Chỉ định rằng trigger nên được kích hoạt sau một 操作DELETE
FOR EACH ROW Chỉ thị rằng trigger nên thực thi một lần cho mỗi hàng bị ảnh hưởng
OLD Từ khóa được sử dụng để truy cập các giá trị của hàng bị xóa trong thân trigger
INSERT INTO Lệnh SQL được sử dụng để chèn các bản ghi mới vào bảng (thường được sử dụng trong trigger để ghi lại dữ liệu bị xóa)
UPDATE Lệnh SQL được sử dụng để sửa đổi các bản ghi hiện có trong bảng ( có thể được sử dụng trong trigger để cập nhật các bảng liên quan)

Credits: Image by storyset