こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

トリガで複数行のインサートを実行したい

mysql 5.5.16で、全体ユーザーから誕生日が来た人だけを選別する仕組みを作っています。

テーブル user (id_1 INT, user_1 TEXT,count_1 INT,nextbirthday_1 DATETIME)
テーブル 20years (id_2 INT, user_2 TEXT,nextbirthday_2 DATETIME)

userテーブルには1000人の19才ユーザーが配置されています。
このリストから「20才の誕生日が着たら20yearsテーブルに複写させる」ことを考えました。

まずは、EVENT でrecordにある1000人のユーザー全ての count_1 を毎日1回づつUPDATEさせます。
このアップデートをTRIGGERとして、誕生日と現在時間を見合わせ、誕生日が現在時間より古いユーザーは(誕生日が来たものは)20yearに複写させることを考えました。

その案が下記のEVENT とTRIGGERです。

********************************

CREATE EVENT happybirthday
ON SCHEDULE EVERY 1 DAY
STARTS '2012-04-25 09:00:00'
ENDS '2013-03-31 09:00:00'
DO
UPDATE record SET count_1 = count_1 + 1;

********************************

DELIMITER //
CREATE TRIGGER 20_trigger AFTER UPDATE ON record
FOR EACH ROW BEGIN
IF(SELECT NEW.nextbitthday_1 <= NOW()) THEN
INSERT INTO 20years SET id_2=NEW.id_1,user_2=NEW.user_1,nextbirthday_2=NEW.nextbirthday_1
ON DUPLICATE KEY UPDATE id_2=NEW.id_1;
END IF;
END;
//
DELIMITER ;

********************************

FOR EACH ROW BEGIN で全てのユーザーの誕生日を見に行き、誕生日に4人が該当すれば4人が20yearsに複写されるはずです。

しかし実際には、該当する一番上の一人だけしか複写させることが出来ませんでした。
(本日誕生日のユーザーが4人いて、4/16以前が誕生日の人が10人いた場合、それら合計14人のうち、userテーブル上で一番上に位置するユーザーだけが複写される)

このトリガの書き方では、FOR EACH ROW BEGINと設定しているにも関わらず、全てのユーザーに対してトリガ作業を行わず、上から一人目を抽出した時点で作業を終了しているようです。

アドバイスを頂けましたら幸いです。

尚、ニーズは誕生日が来たユーザーだけを移動することですので、私の発案の方法に限らずもっといい方法があればアドバイスをお願いいたします。

追伸
IF節を全て外しても同様に一人しか抽出しませんでしたので、IF節が悪さをしている訳ではないようです。

よろしくお願いいたします。

投稿日時 - 2012-04-17 22:43:56

QNo.7426883

困ってます

質問者が選んだベストアンサー

INSERT INTO では set での構文は一行insert 用です。
INSERT INTO `tablename` select .. でuser tableから必要な行を選択して流し込めば、複数行insertできる。

投稿日時 - 2012-04-19 11:39:54

お礼

有難うございます。
ご指摘いただいた方法で対応できました!!
INSERT INTO では set での構文は一行insert 用ということを知らず長時間悩んでいました。
有難うございました。本当に助かりました!

投稿日時 - 2012-04-21 06:57:56

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

EVENTで当日の誕生日の人を一括して「20years」にINSERTして、DELETEするのはどうですか。

投稿日時 - 2012-04-19 11:42:23

お礼

アドバイス有難うございます。
確かにご指摘の方法であれば、無駄にカウントアップしていく必要がありませんね。
勉強になります。
この方法についてもトライしてみます。
有難うごさいました。

投稿日時 - 2012-04-21 06:59:21

あなたにオススメの質問