テーブルを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 ステートメントを使用します。
このように、トリガーの寿命は基本的に所属するテーブルと同じであるという点を理解しておけば、意図しないトリガーの消失を防ぎ、安全なデータベース運用につなげることができます。
-
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
-
MySQLの構文エラーとは?予約済みキーワードでテーブルを作成する方法
MySQLの予約済みキーワードによる構文エラーとはMySQLでは、テーブル名に予約済みキーワード(reserved keyword)を使用すると、そのままではSQL構文エラーが発生します。ここでは例として、「groups」という名前のテーブルを作成しようとした場合を見てみましょう。「groups」はMySQLの予約済みキーワードであるため、通常の記述方法ではテーブルを作成できません。エラーが発生するケース以下のように、予約語「groups」を使ってテーブルを作成しようとすると、ERROR 1064という構文エラーが出力されます。mysql> create table groups->