footmark

ひよっこエンジニアの足跡

MySQLの基礎を勉強してみた3

トリガ

トリガとは

テーブルに対して INSERT, UPDATE, DELETE などのコマンドが実行されたとき、それを引き金に特定のコマンドを実行できる機能。

トリガのコマンドを実行するタイミング

コマンドを実行するタイミングはそのきっかけとなるコマンドの実行直前と実行直後から選択する。

BEFORE きっかけとなるコマンドが実行される直前
AFTER きっかけとなるコマンドが実行される直後

カラムの値

また、きっかけとなるコマンドの実行直前の値と実行直後の値も任意のカラムのものを取得できる。

OLD.カラム名 きっかけとなるコマンドが実行される直前の「カラム名」の値
AFTER.カラム名 きっかけとなるコマンドが実行された直後の「カラム名」の値

メリット

例えば INSERT が実行されたとき、同じデータを別のテーブルに INSERT するよう設定しておけば、自動でバックアップを作成することができます。

トリガの作成

CREATE TRIGGER トリガ名 BEFORE(あるいはAFTER)DELETEなどのコマンド
ON テーブル名 FOR EACH ROW
BEGIN
更新前(OLD.カラム名)または更新後(NEW.カラム名)を使った処理
END

トリガのコマンドを記述する際はデリミタとして「;」を付けるので、ストアドプロシージャのときと同様に

DELIMITER //

などの処理をする必要があります。

トランザクション

ストレージエンジンとトランザクション

MySQLにおいて、検索やファイル操作などの処理を行う部分がストレージエンジンです。
MySQLにおける代表的なストレージエンジンとその特徴は以下の通りです。

ストレージエンジン 特徴
MyISAM 高速、デフォルト
InnoDB トランザクションに有効、MyISAMより低速

ストレージエンジン選択の基準として、トランザクションを使うならInnoDB、使わなければMyISAMとしても良い。

トランザクションとは

複数の機能をまとめて扱う機能をトランザクションといいます。トランザクションを始めてから、結果をデータベースに反映させることをコミット、また反映しないで元に戻すことをロールバックといいます。

トランザクションの使用

トランザクション使用の流れは次の通り。

# トランザクションの開始
mysql> START TRANSACTION;

# コマンドを実行
mysql> DELETE FROM テーブル名;

# コミット
mysql> COMMIT;

コマンド実行時にエラーが生じたなど、実行結果を反映せずにトランザクション開始前の状態に戻したい場合は ROLLBACK を使います。

# トランザクションの開始
mysql> START TRANSACTION;

# コマンドを実行
mysql> DELETE FROM テーブル名;

(エラーが生じた)

# ロールバック
mysql> ROLLBACK;

コミット前のテーブル

トランザクションを開始し、コマンドを実行してからコミットするまでの間は、トランザクションを実行したMySQLモニタでは実行結果が反映され、それ以外のMySQLモニタでは反映されていない状態になります。
先の例では

# トランザクションの開始
mysql> START TRANSACTION;

# コマンドを実行
mysql> DELETE FROM テーブル名;

# 実行結果の確認
mysql> SELECT * FROM 削除したテーブル名;
Empty set (0.00 sec)

(トランザクションを実行したMySQLモニタ以外ではテーブルが存在する)

# コミット
mysql> COMMIT;

(全てのMySQLモニタでテーブルが削除される)

まとめ

本シリーズはここまでです!
機能系は知らないの多かったなー。
勉強すればするほどシステム組むときのMySQLの裁量が大きくなりますね。