of MySQL 트리거 - 삽입 전
歡迎,未來的數據庫魔法師!今天,我們將進入MySQL 觸發器的神奇世界,特別是 "Before Insert" 觸發器。如果你是新手,別擔心;我會一步一步地指導你,就像我過去幾年來為無數學生做的那樣。讓我們一起踏上這個令人興奮的旅程吧!
MySQL Before Insert 觸發器是什麼?
想像一下你是一家豪華俱樂部的保鏢。你的工作是檢查每個進入的人。這正是Before Insert 觸發器在數據庫中的作用!它是一個特殊的守護者,在新的數據被插入表中之前會立即行動。
主要點:
- 在 INSERT 操作之前自動激活。
- 可以修改正在插入的數據,甚至完全阻止插入。
- 是維護數據完整性和實施業務規則的有力工具。
現在,讓我們看看如何創建和使用這些觸發器!
創建基本 Before Insert 觸發器
讓我們從一個簡單的例子開始。假設我們有一個名為 employees
的表:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
salary DECIMAL(10, 2),
hire_date DATE
);
現在,讓我們創建一個確保所有新員工的最低工資為30,000美元的觸發器:
DELIMITER //
CREATE TRIGGER before_employee_insert
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
IF NEW.salary < 30000 THEN
SET NEW.salary = 30000;
END IF;
END//
DELIMITER ;
讓我們分解這個:
-
DELIMITER //
: 這會臨時更改分隔符,以便我們在觸發器中使用分號。 -
CREATE TRIGGER before_employee_insert
: 我們正在命名我們的觸發器。 -
BEFORE INSERT ON employees
: 這指定了觸發器應該在什麼時候以及哪個表上激活。 -
FOR EACH ROW
: 觸發器將對被插入的每一行運行。 -
BEGIN ... END
: 這包含我們觸發器的實際代碼。 -
IF NEW.salary < 30000 THEN SET NEW.salary = 30000;
: 這是我們的邏輯。如果工資太低,我們將它設為最低工資。 -
DELIMITER ;
: 我們將分隔符更改回分號。
現在,讓我們測試一下:
INSERT INTO employees (name, salary, hire_date) VALUES ('John Doe', 25000, '2023-05-01');
SELECT * FROM employees;
你會看到 John 的工資已經自動調整為30,000美元。神奇,對吧?
高級 Before Insert 觸發器示例
讓我們提高我們的水平,使用一個更複雜的例子。我們將創建一個觸發器,它會:
- 如果沒有提供僱用日期,則自動將其設為今天。
- 確保名稱為標題大小寫。
- 在獨立的審計表中記錄插入。
首先,讓我們創建一個審計表:
CREATE TABLE employee_audit (
id INT AUTO_INCREMENT PRIMARY KEY,
action VARCHAR(50),
employee_id INT,
old_data TEXT,
new_data TEXT,
changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
現在,這是我們的高級觸發器:
DELIMITER //
CREATE TRIGGER before_employee_insert_advanced
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
-- 如果沒有提供僱用日期,則將其設為今天
IF NEW.hire_date IS NULL THEN
SET NEW.hire_date = CURDATE();
END IF;
-- 將名稱轉換為標題大小寫
SET NEW.name = CONCAT(
UPPER(SUBSTRING(NEW.name, 1, 1)),
LOWER(SUBSTRING(NEW.name FROM 2))
);
-- 記錄插入
INSERT INTO employee_audit (action, employee_id, new_data)
VALUES ('INSERT', NEW.id, CONCAT('Name: ', NEW.name, ', Salary: ', NEW.salary, ', Hire Date: ', NEW.hire_date));
END//
DELIMITER ;
這個觸發器做了很多:
- 檢查
hire_date
是否為 NULL,如果是,則設為當前日期。 - 使用字符串函數將名稱轉換為標題大小寫。
- 將插入記錄到我們的
employee_audit
表中。
讓我們測試一下:
INSERT INTO employees (name, salary) VALUES ('jANE smith', 40000);
SELECT * FROM employees;
SELECT * FROM employee_audit;
你會看到 Jane 的名稱現在已經正確地首字母大寫,她有一個僱用日期,并且在審計表中有一個條目!
使用客戶端程序使用 Before Insert 觸發器
雖然我們一直在使用 MySQL 命令行,你也可以通過像 MySQL Workbench 或 phpMyAdmin 這樣的客戶端程序創建和使用觸發器。過程很相似:
- 連接到你的數據庫。
- 打開一個新的 SQL 腳本或查詢窗口。
- 將你的觸發器創建代碼粘貼進去。
- 執行腳本。
這是一個在不同環境中創建觸發器的常用方法表:
環境 | 方法 |
---|---|
MySQL CLI | 鍵入或直接粘貼觸發器代碼 |
MySQL Workbench | 使用 SQL 編輯器編寫和執行觸發器代碼 |
phpMyAdmin | 尋找表的 'Triggers' 標籤,使用 GUI 或編寫 SQL |
應用程序代碼 | 使用數據庫連接庫執行 SQL 以創建觸發器 |
記住,無論使用哪種方法,SQL 語法都保持不變!
結論
恭喜你!你已經開始進入 MySQL 觸發器的世界。我們已經介紹了基礎知識,創建了一些強大的觸發器,甚至還觸及了在不同環境中使用它們的方法。
在你繼續你的數據庫之旅時,記住觸發器就像是數據的沉默守護者。它們在背後辛勤工作,確保你的數據保持清潔、一致,並符合你的業務規則。
繼續練習,嘗試,最重要的是,享受其中!也許有一天,你會成為教導新一代數據庫愛好者關於觸發器奇蹟的那個人。
高興編程,願你的查詢總是返回你期望的結果!
Credits: Image by storyset