MySQL - 刪除後觸發器

你好,有志於數據庫的熱心同好!今天,我們將進入MySQL觸發器的迷人世界,特別是刪除後觸發器。作為你們友好的鄰居計算機科學老師,我非常興奮能夠帶領你們進行這次旅行。如果你是編程新手,別擔心——我們會從基礎開始,逐步學習。所以,來一杯咖啡(或者如果你喜歡,來一杯茶),我們開始吧!

MySQL - After Delete Trigger

MySQL是什麼?

在我們跳進刪除後觸發器之前,讓我們了解一下MySQL中的觸發器是什麼。想象一下,你有一條忠誠的狗,每次有人按門鈴時它都會叫。在這個比喻中,門鈴是一個事件,而狗的叫聲是對這個事件的自動反應。同樣地,在MySQL中,觸發器是對數據庫中特定事件的自動反應。

MySQL刪除後觸發器

現在,讓我們聚焦於我們今日的明星——刪除後觸發器。正如其名,當表上發生DELETE操作時,此觸發器會被觸發。這就像有一個清理隊伍在派對結束後出動,確保一切井然有序。

刪除後觸發器的語法

以下是創建刪除後觸發器的基本語法:

CREATE TRIGGER trigger_name
AFTER DELETE ON table_name
FOR EACH ROW
BEGIN
-- 觸發器體
END;

讓我們分解這個語法:

  1. CREATE TRIGGER trigger_name:這裡是你給觸發器命名的部分。
  2. AFTER DELETE ON table_name:這指定了觸發器應該在對指定表進行DELETE操作後觸發。
  3. FOR EACH ROW:這意味著觸發器將對DELETE操作影響的每一行執行一次。
  4. BEGINEND:這些關鍵字包住了觸發器的體,你在此定義應該執行的操作。

示例 1:記錄刪除的記錄

假設我們有一個students表,並且我們想要追踪刪除的學生記錄。我們可以創建一個deleted_students_log表,並使用刪除後觸發器來記錄刪除的記錄。

首先,讓我們創建我們的表:

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
);

現在,讓我們創建我們的刪除後觸發器:

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 ;

在這個觸發器中,我們使用OLD關鍵字來訪問刪除行的值。每次從students表中刪除一個學生,他們的信息將自動記錄到deleted_students_log表中。

示例 2:更新相關表

有時候,當你刪除一條記錄時,你需要更新相關的表。假設我們有一個classes表,它記錄了每個班的學生數量。當一個學生被刪除時,我們想要為他們的班級減少學生數量。

首先,讓我們創建我們的classes表:

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

現在,讓我們修改我們的students表以包含一個class_id

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

最後,讓我們創建一個刪除後觸發器來更新classes表中的student_count

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 ;

當一個學生被刪除時,這個觸發器將自動減少相應班級的student_count

使用客戶端程序使用刪除後觸發器

現在我們了解了MySQL中的刪除後觸發器是如何工作的,讓我們看看如何使用客戶端程序與之交互。對於這個示例,我們將使用Python和mysql-connector庫。

首先,確保你已經安裝了mysql-connector。你可以使用pip來安裝它:

pip install mysql-connector-python

現在,讓我們寫一個Python腚本來演示我們的刪除後觸發器的使用:

import mysql.connector

# 連接到MySQL數據庫
db = mysql.connector.connect(
host="localhost",
user="your_username",
password="your_password",
database="your_database_name"
)

cursor = db.cursor()

# 插入一個學生
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"學生 {name} 插入成功。")

# 刪除一個學生
def delete_student(id):
sql = "DELETE FROM students WHERE id = %s"
value = (id,)
cursor.execute(sql, value)
db.commit()
print(f"學生ID {id} 刪除成功。")

# 檢查刪除學生記錄
def check_deleted_log():
cursor.execute("SELECT * FROM deleted_students_log")
result = cursor.fetchall()
print("刪除學生記錄:")
for row in result:
print(row)

# 檢查班級學生數量
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"班級 {class_id} 學生數量:{result[0]}")

# 主程序
if __name__ == "__main__":
# 插入一個學生
insert_student(1, "Alice", 10, 1)

# 刪除該學生
delete_student(1)

# 檢查刪除的學生記錄
check_deleted_log()

# 檢查班級學生數量
check_class_count(1)

# 關閉數據庫連接
db.close()

這個腚本演示了如何插入一個學生,刪除他們,然後檢查刪除學生記錄和更新的班級數量。當你運行這個腚本時,你會看到刪除後觸發器在起作用!

結論

恭喜你!你剛剛踏入了MySQL刪除後觸發器的世界。我們已經介紹了觸發器是什麼,如何創建刪除後觸發器,甚至還有如何使用Python客戶端程序與之交互。

記住,觸發器是數據庫管理中的強大工具,但請謹慎使用。如果過度使用,它們可能會影響性能,所以總是考慮觸發器是否是你特定用例的最佳解決方案。

在你繼續數據庫編程的旅程中,請持續探索和實驗。誰知道呢?你可能會觸發一個對數據庫終生的熱情!(看見我在這裡做了什麼嗎?為你們來一點數據庫幽默!)

快樂編程,願你的查詢總是運行順利!

Credits: Image by storyset