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

テーブルをDROPするとトリガーはどうなる?MySQLにおけるトリガーの削除挙動を解説


MySQLでは、テーブルを削除(DROP)すると、そのテーブルに関連付けられていたトリガーも自動的に削除されます。これは、トリガーが必ず特定のテーブルに紐づけて定義されるためで、テーブルの削除に伴いトリガーも一緒に破棄される仕組みになっています。ここでは、実際のコマンド実行例を通じて、この挙動をわかりやすく確認していきます。

例:テーブル削除前のトリガー状態を確認する

ここでは、「sample」というテーブルに「trigger_before_delete_sample」という名前のトリガーが定義されている場合を想定します。まず、SHOW TRIGGERS ステートメントを実行し、現在データベースに存在するトリガーの一覧を確認してみましょう。

mysql> Show Triggers\G
*************************** 1. row ***************************
              Trigger: trigger_before_delete_sample
                Event: DELETE
                Table: sample
              Statement: BEGIN
         SET @count = if (@count IS NULL, 1, (@count+1));
         INSERT INTO sample_rowaffected values (@count);
END
               Timing: BEFORE
              Created: 2017-11-21 12:31:58.70
             sql_mode: ONLY_FULL_GROUP_BY,
                       STRICT_TRANS_TABLES,
                       NO_ZERO_IN_DATE,
                       NO_ZERO_DATE,
                       ERROR_FOR_DIVISION_BY_ZERO,
                       NO_AUTO_CREATE_USER,
                       NO_ENGINE_SUBSTITUTION
              Definer: root@localhost
 character_set_client: cp850
 collation_connection: cp850_general_ci
   Database Collation: latin1_swedish_ci
*************************** 2. row ***************************
              Trigger: before_inser_studentage
                Event: INSERT
                Table: student_age
              Statement: IF NEW.age < 0 THEN SET NEW.age = 0;
END IF
               Timing: BEFORE
              Created: 2017-11-21 11:26:15.34
             sql_mode: ONLY_FULL_GROUP_BY,
                       STRICT_TRANS_TABLES,
                       NO_ZERO_IN_DATE,
                       NO_ZERO_DATE,
                       ERROR_FOR_DIVISION_BY_ZERO,
                       NO_AUTO_CREATE_USER,
                       NO_ENGINE_SUBSTITUTION
              Definer: root@localhost
 character_set_client: cp850
 collation_connection: cp850_general_ci
   Database Collation: latin1_swedish_ci
2 rows in set (0.01 sec)

上記の実行結果から、データベースには2つのトリガーが存在していることがわかります。このうち「trigger_before_delete_sample」は「sample」テーブルに、もう1つの「before_inser_studentage」は「student_age」テーブルにそれぞれ関連付けられています。

sampleテーブルをDROPする

次に、以下のステートメントを実行して「sample」テーブルを削除します。

mysql> DROP table sample;
Query OK, 0 rows affected (0.26 sec)

削除後のトリガー状態を再確認する

テーブル削除後に、再度 SHOW TRIGGERS ステートメントを実行してみましょう。

mysql> Show Triggers\G
*************************** 1. row ***************************
              Trigger: before_inser_studentage
                Event: INSERT
                Table: student_age
              Statement: IF NEW.age < 0 THEN SET NEW.age = 0;
END IF
               Timing: BEFORE
              Created: 2017-11-21 11:26:15.34
             sql_mode: ONLY_FULL_GROUP_BY,
                       STRICT_TRANS_TABLES,
                       NO_ZERO_IN_DATE,
                       NO_ZERO_DATE,
                       ERROR_FOR_DIVISION_BY_ZERO,
                       NO_AUTO_CREATE_USER,
                       NO_ENGINE_SUBSTITUTION
              Definer: root@localhost
 character_set_client: cp850
 collation_connection: cp850_general_ci
   Database Collation: latin1_swedish_ci
1 row in set (0.01 sec)

結果は1件のみとなり、「sample」テーブルに関連付けられていた「trigger_before_delete_sample」トリガーが、テーブルと共に削除されたことが確認できます。一方、「student_age」テーブルに紐づく「before_inser_studentage」トリガーは一切影響を受けていません。

ポイントまとめ

  • MySQLでは、トリガーは必ず特定のテーブルに紐づいて定義されます。
  • DROP TABLE を実行すると、そのテーブルに定義されていたトリガーも一緒に削除されます。
  • テーブルを残したままトリガーだけを削除したい場合は、DROP TRIGGER ステートメントを使用します。

このように、トリガーの寿命は基本的に所属するテーブルと同じであるという点を理解しておけば、意図しないトリガーの消失を防ぎ、安全なデータベース運用につなげることができます。

  1. MySQLでテーブルの値をシャッフルする方法:RAND()関数を使ったランダム並び替え

    MySQLでテーブル内の値(行)の順序をランダムに入れ替えたい場合は、RAND()関数とORDER BY句を組み合わせることで簡単に実現できます。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable792 ( Name varchar(100), Subject varchar(100) ); Query OK, 0 rows affected (0.66 sec)レコードの挿入次に、INSERT文を使ってテーブルにいくつかのレコードを挿入します。mysql> insert into DemoTable79

  2. MySQLの構文エラーとは?予約済みキーワードでテーブルを作成する方法

    MySQLの予約済みキーワードによる構文エラーとはMySQLでは、テーブル名に予約済みキーワード(reserved keyword)を使用すると、そのままではSQL構文エラーが発生します。ここでは例として、「groups」という名前のテーブルを作成しようとした場合を見てみましょう。「groups」はMySQLの予約済みキーワードであるため、通常の記述方法ではテーブルを作成できません。エラーが発生するケース以下のように、予約語「groups」を使ってテーブルを作成しようとすると、ERROR 1064という構文エラーが出力されます。mysql> create table groups->