of MySQL 트리거 - 삽입 전

MySQL - Before Insert Trigger

歡迎,未來的數據庫魔法師!今天,我們將進入MySQL 觸發器的神奇世界,特別是 "Before Insert" 觸發器。如果你是新手,別擔心;我會一步一步地指導你,就像我過去幾年來為無數學生做的那樣。讓我們一起踏上這個令人興奮的旅程吧!

MySQL Before Insert 觸發器是什麼?

想像一下你是一家豪華俱樂部的保鏢。你的工作是檢查每個進入的人。這正是Before Insert 觸發器在數據庫中的作用!它是一個特殊的守護者,在新的數據被插入表中之前會立即行動。

主要點:

  1. 在 INSERT 操作之前自動激活。
  2. 可以修改正在插入的數據,甚至完全阻止插入。
  3. 是維護數據完整性和實施業務規則的有力工具。

現在,讓我們看看如何創建和使用這些觸發器!

創建基本 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 ;

讓我們分解這個:

  1. DELIMITER //: 這會臨時更改分隔符,以便我們在觸發器中使用分號。
  2. CREATE TRIGGER before_employee_insert: 我們正在命名我們的觸發器。
  3. BEFORE INSERT ON employees: 這指定了觸發器應該在什麼時候以及哪個表上激活。
  4. FOR EACH ROW: 觸發器將對被插入的每一行運行。
  5. BEGIN ... END: 這包含我們觸發器的實際代碼。
  6. IF NEW.salary < 30000 THEN SET NEW.salary = 30000;: 這是我們的邏輯。如果工資太低,我們將它設為最低工資。
  7. DELIMITER ;: 我們將分隔符更改回分號。

現在,讓我們測試一下:

INSERT INTO employees (name, salary, hire_date) VALUES ('John Doe', 25000, '2023-05-01');
SELECT * FROM employees;

你會看到 John 的工資已經自動調整為30,000美元。神奇,對吧?

高級 Before Insert 觸發器示例

讓我們提高我們的水平,使用一個更複雜的例子。我們將創建一個觸發器,它會:

  1. 如果沒有提供僱用日期,則自動將其設為今天。
  2. 確保名稱為標題大小寫。
  3. 在獨立的審計表中記錄插入。

首先,讓我們創建一個審計表:

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 ;

這個觸發器做了很多:

  1. 檢查 hire_date 是否為 NULL,如果是,則設為當前日期。
  2. 使用字符串函數將名稱轉換為標題大小寫。
  3. 將插入記錄到我們的 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 這樣的客戶端程序創建和使用觸發器。過程很相似:

  1. 連接到你的數據庫。
  2. 打開一個新的 SQL 腳本或查詢窗口。
  3. 將你的觸發器創建代碼粘貼進去。
  4. 執行腳本。

這是一個在不同環境中創建觸發器的常用方法表:

環境 方法
MySQL CLI 鍵入或直接粘貼觸發器代碼
MySQL Workbench 使用 SQL 編輯器編寫和執行觸發器代碼
phpMyAdmin 尋找表的 'Triggers' 標籤,使用 GUI 或編寫 SQL
應用程序代碼 使用數據庫連接庫執行 SQL 以創建觸發器

記住,無論使用哪種方法,SQL 語法都保持不變!

結論

恭喜你!你已經開始進入 MySQL 觸發器的世界。我們已經介紹了基礎知識,創建了一些強大的觸發器,甚至還觸及了在不同環境中使用它們的方法。

在你繼續你的數據庫之旅時,記住觸發器就像是數據的沉默守護者。它們在背後辛勤工作,確保你的數據保持清潔、一致,並符合你的業務規則。

繼續練習,嘗試,最重要的是,享受其中!也許有一天,你會成為教導新一代數據庫愛好者關於觸發器奇蹟的那個人。

高興編程,願你的查詢總是返回你期望的結果!

Credits: Image by storyset