MySQL - インサート前トリガー

こんにちは、未来のデータベース魔术師たち!今日は、MySQLのトリガーの魔法の世界に飛び込みます。特に「インサート前」トリガーについてです。これは初めてでも心配しないでください。私はこれまでに多くの生徒を指導してきましたので、ステップバイステップで案内します。一緒にこのエキサイティングな旅に出発しましょう!

MySQL - Before Insert Trigger

MySQLのBefore Insert Triggerとは?

一流クラブのボーイとして考えてみてください。あなたの仕事は、入場する前に皆をチェックすることです。それと同じことをデータベース内でBefore Insertトリガーが行います!新しいデータがテーブルに挿入される直前に作動する特別なガードナーです。

主要なポイント:

  1. INSERT操作の前に自動的にアクティブになります。
  2. 挿入されるデータを修正するか、挿入自体を阻止することができます。
  3. データの整合性を保ち、ビジネスルールを強制するための強力なツールです。

では、これらのトリガーを作成して使用する方法を見てみましょう!

基本的なBefore Insert Triggerの作成

まずは簡単な例から始めましょう。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: トリガーがinsertされるEach行に対して実行されます。
  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 Triggerの例

もっと複雑な例を見てみましょう。以下の動作をするトリガーを作成します:

  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. 挿入を監査テーブルにログします。

これを試してみましょう:

INSERT INTO employees (name, salary) VALUES ('jANE smith', 40000);
SELECT * FROM employees;
SELECT * FROM employee_audit;

Janeの名前が正しく大文字と小文字に変換され、採用日が設定され、監査テーブルにエントリが追加されていることを確認できます!

クライアントプログラムを使用したBefore Insert Trigger

これまでMySQLコマンドラインを使用してきましたが、MySQL WorkbenchやphpMyAdminなどのクライアントプログラムを使用してトリガーを作成および使用することもできます。プロセスは似ています:

  1. データベースに接続します。
  2. 新しいSQLスクリプトまたはクエリウィンドウを開きます。
  3. トリガー作成コードを貼り付けます。
  4. スクリプトを実行します。

以下は、異なる環境でトリガーを作成する一般的な方法の一覧です:

環境 方法
MySQL CLI 直接または貼り付けしてトリガーコードを入力
MySQL Workbench SQLエディタを使用してトリガーコードを書き込んで実行
phpMyAdmin テーブルの「トリガー」タブに移動してGUIを使用またはSQLを書き込む
アプリケーションコード データベース接続ライブラリを使用してSQLを実行

環境に関係なく、SQLシンタックスは同じです!

結論

おめでとうございます!MySQLトリガーの世界への初めてのステップを踏み出しました。基本を学び、強力なトリガーを作成し、さまざまな環境で使用する方法を触れました。

データベースの旅を続ける中で、トリガーはデータのクリーンさ、一貫性、ビジネスルールの強制を裏で默默に守る守護者です。

練習を続け、実験をし、最も重要なのは、楽しむことです!いつかあなたが新しいデータベース愛好家たちにトリガーの奇跡について教える日が来るかもしれません。

ハッピーコーディング、あなたのクエリがいつも期待通りの結果を返すことを祈っています!

Credits: Image by storyset