しょぽろぐ::新米SE()

新米SEが未来の後輩に馬鹿にされないように頑張るぶろぐ

MySQLのトリガーを初めて使った話

トリガーとは

仕事の都合上、MySQLで履歴テーブルをつくらないといけなくなった。

現行のシステムでは、PHP側で2テーブルに更新・挿入を行っているらしい。

えっじゃあそれそのままでええんとちゃうん、そのままの方がええんちゃうんお兄さんと思ったんだけど、たまたま手元にあった『データベース実践入門』(著者の方は漢(オトコ)のコンピュータ道の奥野さんという有名な方)にチラホラ”トリガ”という単語が出てきていてそれっぽかったので調べてみることにした。

nippondanji.blogspot.jp

 

 

いくらかヤフーでググったところ、トリガを定義するテーブルに何かしらのアクション(INSERT,UPDATE,DELETE)を起こした際に、自動で他のテーブルもしくは該当テーブルにSQLを投げられる機能らしい。他にもいろいろ出来るのかもしれないけれど、とりあえず目的は達成できそうな気がする。

というか世間では当然のように使っている機能らしい。技術力がないと言われているようで悲しい。

 

で、なにはともあれ使ってみた。

 

実践

f:id:shopoon:20150501021344p:plain

 

よくよく見たらphpmyadminのメニューバー上に大きく「トリガ」ってかいてあった。

明らかに自分が悪いんだけど、そんな便利なものがあるならもうちょっと自己主張してもいいんじゃないかトリガさん。

トリガを定義するテーブルoriginを作成、同じ構造のテーブルにカラムhistory_id(名前は何でもいい)を加えたテーブルhistoryを作成。

上記画像のようにトリガを付けてoriginに挿入して、historyをみてみた。

 

f:id:shopoon:20150501021854p:plain

 

おー、originに入れたらhistoryにもちゃんとはいってる。

idが0になってるのはトリガの実行時期をBEFOREに設定してた時の分。origin.idはオートインクリメントになってるから、BEFOREだとまだnew.idが確定しないタイミングで挿入をかけることになる。そうするとこうなっちゃうっぽい。AFTERにしたらちゃんと5が入ったから、多分間違ってないと思う。

 

感想

これがあれば「おいこの画面だけ履歴テーブルにINSERTかかってねえじゃねえか!!!」とか言われることもなくなる!!!!!!!!!!

便利すぎておしっこちびりそうになるくらい便利。というか今までなんでこれ使ってこなかったんだろうバカなのってレベル。上司に聞いてみたら、「うちのサービスmysql4の頃につくったからそんな便利なものまだ無かったんだと思う」とのこと。じゃあしょうがないね。進歩ってうれしいね。

まだよく分かってないんだけど、これとストアドプロージャを上手く使えばデータの整合性で心配することはグッと減りそうな気がする。ちゃんとデータベース実践入門読もう。

データベースとの接続も一回で済むし、コーディングもしないで済む。コスト的にもセキュリティ的にもメリットしかないように見えるなあ。勿論使える場面使えない場面っていうのはあるだろうけど、なんか裏があったりするのかな?

 

それはそうとセブンイレブングリーンカレーがうますぎてヤバイ。マッサマンカレーもうますぎてヤバイ