MySQL - アップデート後トリガー

MySQL アップデート後トリガーの紹介

こんにちは、データベース愛好家の皆さん!今日は、MySQLのアップデート後トリガーの魅力あふれる世界に潜り込みます。新しいことに戸惑う必要はありません - この旅のガイドとして、私があなたを親切に案内します。これから基本から始め、少しずつ進んでいきましょう!

MySQL - After Update Trigger

トリガーとは?

データベース内で特定のことが起こるたびに魔法のアラームが鳴ることを想像してみてください。それがトリガーなのです!データベース内で特定のイベントが発生したときに自動的に実行される特殊な種類の保存プログラムです。

アップデート後トリガーとは?

アップデート後トリガーは、テーブルに対してUPDATE操作が実行された後に発火する特定の種類のトリガーです。データを変更した後に即座に動作を開始する用心深いアシスタントを持っているようなものです。

最初のアップデート後トリガーを作成する

それでは、袖をまくって初めてのアップデート後トリガーを作成しましょう!まずは簡単な例から始めてみましょう。

プレイグラウンドの設定

まず、簡単なテーブルを作成します:

CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
salary DECIMAL(10, 2),
last_updated TIMESTAMP
);

このテーブルは従業員の情報を管理します。次に、従業員の給料が変更されたときに自動的に 'last_updated' 列を更新するアップデート後トリガーを追加します。

トリガーの作成

以下のようにトリガーを作成します:

DELIMITER //
CREATE TRIGGER update_employee_timestamp
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
IF OLD.salary != NEW.salary THEN
SET NEW.last_updated = CURRENT_TIMESTAMP;
END IF;
END //
DELIMITER ;

これを分解すると:

  1. DELIMITER //: デリミタを一時的に変更し、トリガーの定義内でセミコロンを使用できます。
  2. CREATE TRIGGER update_employee_timestamp: トリガーを 'update_employee_timestamp' という名前で作成します。
  3. AFTER UPDATE ON employees: 'employees' テーブルのUPDATE操作の後にトリガーが発火します。
  4. FOR EACH ROW: トリガーはUPDATEされた各行に対して発火します。
  5. IF OLD.salary != NEW.salary THEN: 給料が変更されたかどうかをチェックします。
  6. SET NEW.last_updated = CURRENT_TIMESTAMP: 給料が変更された場合、'last_updated' 列を現在時刻に更新します。
  7. DELIMITER ;: デリミタを元に戻します。

トリガーのテスト

以下のコマンドを実行してトリガーを動作確認します:

INSERT INTO employees (id, name, salary) VALUES (1, 'John Doe', 50000);
UPDATE employees SET salary = 55000 WHERE id = 1;
SELECT * FROM employees;

これらのコマンドを実行した後、'last_updated' 列が自動的に現在時刻で埋め込まれていることを確認できます。

高度なアップデート後トリガーテクニック

基本を理解したので、さらに高度な技術を見てみましょう。

変更のログ記録

アップデート後トリガーの一般的な用途の一つは変更のログ記録です。まず、給料変更を記録する新しいテーブルを作成します:

CREATE TABLE salary_changes (
id INT AUTO_INCREMENT PRIMARY KEY,
employee_id INT,
old_salary DECIMAL(10, 2),
new_salary DECIMAL(10, 2),
change_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

次に、トリガーを変更してこれらの変更を記録します:

DELIMITER //
CREATE TRIGGER log_salary_changes
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
IF OLD.salary != NEW.salary THEN
INSERT INTO salary_changes (employee_id, old_salary, new_salary)
VALUES (NEW.id, OLD.salary, NEW.salary);
END IF;
END //
DELIMITER ;

このトリガーは、従業員の給料が更新されるたびに 'salary_changes' テーブルに新しいエントリを作成します。

条件付きロジックの使用

トリガーにはより複雑な条件付きロジックも含めることができます。例えば、給料の減少を防ぐ場合:

DELIMITER //
CREATE TRIGGER prevent_salary_decrease
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
IF NEW.salary < OLD.salary THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Salary cannot be decreased';
END IF;
END //
DELIMITER ;

このトリガーは、誰かが従業員の給料を下げようとする場合にエラーを発生させます。

クライアントプログラムを使用したアップデート後トリガー

MySQLで直接トリガーを作成することに焦点を当ててきましたが、クライアントプログラムを使用してトリガーを管理することもできます。多くのデータベース管理ツールやプログラミング言語は、MySQLトリガーを操作するインターフェースを提供しています。

PHPを使用してトリガーを作成する

以下は、PHPを使用してトリガーを作成する例です:

<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

// 接続を開く
$conn = new mysqli($servername, $username, $password, $dbname);

// 接続を確認
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

// トリガーを作成するためのSQL
$sql = "
CREATE TRIGGER update_employee_timestamp
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
IF OLD.salary != NEW.salary THEN
SET NEW.last_updated = CURRENT_TIMESTAMP;
END IF;
END
";

// クエリを実行
if ($conn->multi_query($sql) === TRUE) {
echo "Trigger created successfully";
} else {
echo "Error creating trigger: " . $conn->error;
}

$conn->close();
?>

このPHPスクリプトは、データベースに接続し、先ほど作成した 'update_employee_timestamp' トリガーを生成します。

結論

そして、皆さん!MySQLのアップデート後トリガーの世界を旅しました。基本から高度な技術まで、トリガーはデータの整合性を保ち、自動化されたタスクを実行する強力なツールですが、慎重に使用する必要があります。過度な使用はパフォーマンスの問題を引き起こす可能性があります。

いずれのプログラミング概念でも、トリガーをマスターする鍵は練習です。さまざまなシナリオを試し、トリガーがデータベースの作業をより効率的にする方法を見つけてください。ハッピートリガー!

Credits: Image by storyset