MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのトリガーで DELIMITER // は何をする?区切り文字変更の役割を実例で解説

はじめに:DELIMITER // の役割とは

MySQLでは、DELIMITER // コマンドを使用することで、ステートメントの区切り文字を通常のセミコロン(;)から「//」へ変更できます。これにより、トリガー本体の中にセミコロンを含む複数のステートメントを問題なく記述できるようになります。

本記事では、トリガーの動作をデモ形式でわかりやすく解説します。この例では、EmployeeSalary(従業員給与)カラムに1000未満の値が入力された場合、自動的に10000が設定されるトリガーを作成します。

ステップ1:テーブルを作成する

まず、サンプル用のテーブルを作成しましょう。テーブル作成のクエリは以下の通りです。

mysql> create table EmployeeTable
-> (
-> EmployeeId int,
-> EmployeeName varchar(100),
-> EmployeeSalary float
-> );
Query OK, 0 rows affected (0.76 sec)

ステップ2:トリガーを作成する

テーブルを作成したら、次にINSERTコマンドに対してトリガーを定義します。トリガー作成のクエリは以下の通りです。

mysql> delimiter //
mysql> create trigger CheckSalary before insert on EmployeeTable
-> for each row if new.EmployeeSalary < 1000 then set
-> new.EmployeeSalary=10000;
-> end if;
-> //
Query OK, 0 rows affected (0.40 sec)
mysql> delimiter ;

ここで注目すべきは、IF文の中にセミコロンが含まれている点です。delimiter // によって一時的に区切り文字を変更しているため、MySQLクライアントは途中のセミコロンを文の終端と誤認せず、トリガー全体を正しく登録できます。定義が完了したら、忘れずに delimiter ; で元の区切り文字へ戻しておきましょう。

ステップ3:トリガーの動作を確認する

それでは、INSERTコマンドでトリガーの挙動をチェックしてみます。EmployeeSalaryに1000未満の値を挿入してもエラーは発生せず、代わりにデフォルト値として設定した10000が格納されます。

レコード挿入のクエリは以下の通りです。

mysql> insert into EmployeeTable values(1,'Carol',500);
Query OK, 1 row affected (0.25 sec)

SELECT文でテーブル内の全レコードを確認します。

mysql> select *from EmployeeTable;

実行結果は以下のようになります。

+------------+--------------+----------------+
| EmployeeId | EmployeeName | EmployeeSalary |
+------------+--------------+----------------+
| 1          | Carol        | 10000          |
+------------+--------------+----------------+
1 row in set (0.00 sec)

挿入時には500という値を指定しましたが、結果には10000が保存されていることがわかります。これがトリガーによる自動変換の効果です。

ステップ4:1000以上の値を挿入した場合

一方、1000以上の値を挿入した場合は、入力した数値がそのまま保存されます。まず、TRUNCATEコマンドで先ほどのレコードを削除しておきます。

mysql> truncate table EmployeeTable;
Query OK, 0 rows affected (1.44 sec)

続けて、新しいレコードを2件挿入します。

mysql> insert into EmployeeTable values(2,'Bob',1000);
Query OK, 1 row affected (0.14 sec)

mysql> insert into EmployeeTable values(3,'Carol',2500);
Query OK, 1 row affected (0.19 sec)

SELECT文で全レコードを確認してみましょう。

mysql> select *from EmployeeTable;

実行結果は以下の通りです。

+------------+--------------+----------------+
| EmployeeId | EmployeeName | EmployeeSalary |
+------------+--------------+----------------+
| 2          | Bob          | 1000           |
| 3          | Carol        | 2500           |
+------------+--------------+----------------+
2 rows in set (0.00 sec)

まとめ

上記の出力例からわかるように、EmployeeSalaryが1000以上の場合は入力された給与額がそのまま反映されます。逆に、1000未満の値が入力された場合のみ、デフォルト値として10000が自動的に設定される仕組みです。

重要なポイント: DELIMITER // は、トリガーやストアドプロシージャなど、内部にセミコロンを含む複合ステートメントを定義する際に必須となるコマンドです。これにより、MySQLクライアントがトリガー本文中のセミコロンを誤って文の終端として扱うのを防げます。作業後は必ず元の区切り文字に戻すことを忘れないようにしましょう。

  1. MySQLのSELECT(列名)の括弧の意味は?エイリアスの作成方法を解説

    SELECT(列名)の括弧は何を意味するのか?MySQLのSELECT文で(列名)のように括弧を付けると、その列に対してエイリアス(別名)を作成することを意味します。括弧自体は必須の構文ではなく、列名を明確に区切って可読性を高めるための書き方です。ここでは、実際の例を使ってその動作を確認していきましょう。サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable865( FirstName varchar(100), LastName varchar(100));Query OK, 0 rows affecte

  2. MySQLの@@identityとは?最後に挿入されたAUTO_INCREMENT値を取得する方法

    MySQLにおける@@identityとは @@identityは、現在のセッション内でAUTO_INCREMENTカラムに最後に挿入された値を返すシステム変数です。新規レコード追加後に、自動採番されたIDをすぐに取得したい場合などに活用できます。ここでは、実際にテーブルを作成して動作を確認してみましょう。 1. テーブルの作成 まず、以下のコマンドでサンプル用のテーブルを作成します。 mysql> create table DemoTable(     UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY