質問: 件名のようなことは可能でしょうか?もし可能であればどのような方法でできますか? 少し調べてMySQLのトリガを使えばできそうだと思ったのですが、 詳しく教えていただけないでしょうか。 ※背景ですが、ECサイト運営しているのですが、 自社開発の管理画面の顧客電話番号検索でハイフンをREPLACEで置換して消して検索かけているのが原因で検索処理が重たいことが判明しました。(※今はハイフンと数字の組合せを1つのinputボックスに対してお客様が自由入力できる。) そこでハイフン無しの電話番号を保存する新しいカラムを用意したいと思っています。 SELECTに関してはプログラムを書き換えて新しいカラムをサーチするように随時対応していけば良いのですが、 関連プログラムのINSERT/UPDATEを漏れ無く確認→修正というと結構大変です。 バッチ処理も考えましたが、リアルタイムでは無くなりますし、 もっとスマートな方法がないかと調べていました。 トリガは今まで一度も使用したことがないので教えてください。
回答: view を作る方が楽だと思いますが。 ``` CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `tel` varchar(13) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; ``` ``` CREATE VIEW vw_users AS SELECT id, tel, REPLACE(tel, '-', '') AS tel_num FROM users ``` トリガを作成する場合、以下のようなSQLで行うわけですが... ``` DELIMITER $$ CREATE TRIGGER trigger_up AFTER UPDATE ON users FOR EACH ROW BEGIN UPDATE users SET tel_num = REPLACE(tel, '-', ''); END; $$ DELIMITER ; ``` > > Can't update table 'users' in stored function/trigger because it is already used by statem> ent which invoked this stored function/trigger. > > > マニュアルに以下の記載があります。 「ストアド ファンクションまたはトリガ内では、その関数やトリガを実行したステートメントが ( 読み取り、または書込みに ) すでに使用しているテーブルを改変することはできない。」 となると、ハイフンなしのデータを保存するために、別のテーブルを用意しなければなりません。それもまた、プログラムの修正にコストがかかるのではないかと。