MySQL - 創建觸發器:初學者指南

你好,有志於數據庫的愛好者!今天,我們將要進入MySQL觸發器的迷人世界。別擔心你對編程是新手;我將成為你這次旅程中的友好指南。在本教程結束時,你將能像專業人士一樣創建觸發器!

MySQL - Create Trigger

什麼是觸發器?

在我們跳入創建觸發器之前,讓我們先了解它們是什麼。想像你有一隻忠誠的狗,每次有人按門鈴時它都會叫。在數據庫世界中,觸發器就像那隻狗一樣——它對你的數據庫中的特定事件產生自動反應。

定義

觸發器是一個命名的數據庫對象,與一個表相關聯,當該表的特定事件發生時會自動激活。

在MySQL中創建觸發器

既然我們知道了觸發器是什麼,讓我們學習如何在MySQL中創建它們。這就像學習一個新的魔法咒語,不過我們將通過輸入命令而不是揮動魔杖!

基本語法

以下是CREATE TRIGGER語句的基本結構:

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

讓我們分解這個語句:

  1. trigger_name:這是你的觸發器的名稱。選擇一個描述其功能的名稱。
  2. {BEFORE | AFTER}:這決定了觸發器在指定事件之前還是之後激活。
  3. {INSERT | UPDATE | DELETE}:這是觸發器激活的事件。
  4. table_name:與觸發器相關聯的表。
  5. FOR EACH ROW:這意味著觸發器將對事件的每行影響激活。
  6. trigger_body:觸發器激活時要執行的SQL語句。

示例 1:BEFORE INSERT 觸發器

讓我們創建一個觸發器,確保所有員工名稱在插入表之前都是大寫的。

CREATE TRIGGER capitalize_name
BEFORE INSERT ON employees
FOR EACH ROW
SET NEW.name = UPPER(NEW.name);

在這個示例中:

  • 觸發器名為 capitalize_name
  • 它在對 employees 表進行INSERT操作之前激活。
  • 對於每個新行,它使用 UPPER() 函數大寫 name 列。
  • NEW 指的是即將插入的新行。

示例 2:AFTER UPDATE 觸發器

現在,讓我們創建一個觸發器,當薪資變化時在另一個表中記錄。

CREATE TRIGGER log_salary_changes
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
IF OLD.salary <> NEW.salary THEN
INSERT INTO salary_log (employee_id, old_salary, new_salary, change_date)
VALUES (NEW.id, OLD.salary, NEW.salary, NOW());
END IF;
END;

這裡發生了什麼:

  • 觸發器名為 log_salary_changes
  • 它在對 employees 表進行UPDATE操作之後激活。
  • 它檢查薪資是否變化 (OLD.salary <> NEW.salary)。
  • 如果有變化,它將記錄插入 salary_log 表中。
  • OLD 指的是更新前的行,而 NEW 指的是更新後的行。

使用客戶端程序創建觸發器

雖然我們可以直接在MySQL中創建觸發器,但有時使用客戶端程序更方便。讓我們看看如何使用MySQL命令行客戶端來完成這個操作。

步驟 1:連接到MySQL

首先,打開你的終端或命令提示符並連接到MySQL:

mysql -u username -p

username 替換為你的MySQL用戶名。你將被提示輸入密碼。

步驟 2:選擇數據庫

一旦連接,選擇你要操作的數據庫:

USE your_database_name;

步驟 3:創建觸發器

現在,你可以創建你的觸發器。讓我們使用我們的薪資記錄示例:

DELIMITER //

CREATE TRIGGER log_salary_changes
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
IF OLD.salary <> NEW.salary THEN
INSERT INTO salary_log (employee_id, old_salary, new_salary, change_date)
VALUES (NEW.id, OLD.salary, NEW.salary, NOW());
END IF;
END//

DELIMITER ;

注意 DELIMITER //DELIMITER ; 的使用。這是因為我們的觸發器體包含了分號,所以我們需要暫時更改分隔符。

步驟 4:驗證觸發器

為了確保你的觸發器已成功創建,你可以使用:

SHOW TRIGGERS;

這將顯示當前數據庫中的所有觸發器。

觸發器方法

以下是在MySQL中最常見的觸發器方法:

方法 描述
BEFORE INSERT 在新行插入之前激活
AFTER INSERT 在新行插入之後激活
BEFORE UPDATE 在現有行更新之前激活
AFTER UPDATE 在現有行更新之後激活
BEFORE DELETE 在現有行刪除之前激活
AFTER DELETE 在現有行刪除之後激活

記住,每個這些都可以在正確使用時成為強大的工具。就像瑞士軍刀一樣,對你的數據庫來說!

結論

恭喜你!你已經開始進入MySQL觸發器的世界。我們已經介紹了觸發器是什麼,如何創建它們,甚至如何使用客戶端程序。記住,像任何強大的工具一樣,觸發器應該明智地使用。它們可以大大提高你的數據庫操作,但過度使用可能會導致複雜性和性能問題。

在你繼續你的MySQL旅程時,請繼續練習和嘗試使用觸發器。很快,你將能夠創造出讓梅林都會嫉妒的數據庫魔法!快樂編程,願你的查詢總是返回你期望的結果!

Credits: Image by storyset