かってぃのブログ

喫茶店を遊牧しながら勉強したり開発したりする大学院生のブログです。

katty0324

かってぃはCREATE TRIGGERを身につけた!DELETEコマンドをガンガン使えるようになった!

on 2011-02-28 17:26:41

webから

概要!

MySQLでDELETEコマンドを使いたい。

でも、「うっかりSQLを書き間違えて全消去」という展開は避けたい。

そんな時に、TRIGGERを作成して、削除したレコードを自動でコピーしておくことができます。

DELETEコマンド

概要

MySQLのレコードを削除するコマンドです。

DELETE FROM hoge WHERE id = 1;

などとすれば、hogeテーブルの「idが1」のレコードを削除します。

問題点

しかし、うっかりSQLを書き間違えて、次のようにしてしまったらどうなるでしょうか。

DELETE FROM hoge;

この時は、残念ですが、hogeテーブルの「すべて」のレコードを削除します。

TRIGGER

概要

そこで登場するのがTRIGGERです。

その名の通り、何かをトリガー(引き金)にして、SQLを実行するものです。

これを利用して、「DELETEコマンドの実行を引き金」にしてレコードのコピーを実行すれば良いです。

使い方

使い方は、こんな具合。

DELIMITER $$
CREATE TRIGGER trigger_hoge AFTER DELETE ON hoge FOR EACH ROW
  BEGIN
    INSERT INTO trigger_hoge (id, text) VALUES (OLD.id, OLD.text);
  END;
$$
DELIMITER ;

DELIMITERコマンド

SQLの区切りを指定するコマンドです。

初期値は「;」ですが、DELIMITERコマンドで変更することができます。

処理を複数行にわたって書きたい場合に、「;」を書いてしまうとそこで処理が実行されてしまいます。

そのため、一度区切りを「$$」などに変更します。

CREATE TRIGGERコマンド

TRIGGERを作成します。

ここでは、「hogeテーブル」の「各行」について「削除」が実行された「後」に実行する処理を記述するTRIGGERの作成です。

INSERTコマンド

基本的なコマンドですが、TRIGGERを使う時には、ひとつ特殊なことがあります。

挿入する値が、「OLD.id」とか「OLD.text」になっています。

これは、削除を実行する前の値ということです。

まとめ

TRIGGERを指定しておけば、レコード削除時に「うっかりSQLを書き間違えて全消去」しても別テーブルにコピーを保存しておくことができます。

他にも、「レコードが挿入された時」や「変更が加えられた時」をトリガーにして処理を実行することもできます。

便利ですね!


mysql コピー トリガー レコード trigger delete 別テーブル トリガ SQL テーブル