MySQLフリップフロップループ書き込み
2666 ワード
MySQLフリップフロップループ書き込みフリップフロップ 導入問題 改良案 MySQLトリガ について作成トリガ フリップフロップ
導入問題
現在、商品表(t_app_mall)と賞品番号表(t_app_mall_no)があります.商品表に商品レコードを1つ追加すると、商品表の参加者数のフィールドに基づいて、対応する数の賞品番号を生成し、賞品番号表にループします!△賞品番号表の商品idは発表された商品に対応しています.多対一の関係です!)商品を発表するたびに設定された参加者数が異なるため、ある商品を発表する際に設定された参加者数が多すぎる場合、賞品番号表にデータを循環挿入するのに時間がかかります.リクエストが同期されるたびに、ユーザの待ち時間が増加します.ユーザーに対して相対的に友好的ではありません!
改善案
毎回insert/updateの後に賞品番号表に対応数のデータを挿入する必要があることを考慮し(updateの場合、ユーザーが商品情報を変更する際に参加者が必要でない場合は、t_app_mall_noを変更する必要はありません)、MySQLのトリガを使用してこの機能を実現できます!
MySQLトリガについて
定義:トリガは、テーブル操作に関連するデータベース・オブジェクトで、トリガが存在するテーブルに指定されたイベントが発生すると、そのオブジェクト、すなわちテーブルの操作イベントが発表されたトリガの実行にトリガーされます.基本テンプレート:
説明:trigger_name:トリガ名を識別し、ユーザーが自分で指定します.trigger_time:トリガタイミングを識別し、BEFOREまたはAFTERの値をとる.trigger_event:INSERT、UPDATEまたはDELETEの値を持つトリガイベントを識別します.tbl_name:トリガを確立するテーブル名、すなわち、どのテーブルにトリガを確立するかを識別します.trigger_stmt:フリップフロップ・プログラム・ボディ.SQL文またはBEGINとENDに含まれる複数の文です.
このことから、BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETEの6種類のトリガを確立することができる.
もう1つの制限は、同じタイプのトリガを1つのテーブルに同時に2つ作成できないため、1つのテーブルに最大6つのトリガを作成することです.
フリップフロップの作成
1.書き込み時トリガタイマ
2.商品表を更新し、参加人数が変更されたかどうかを判断する
ここまで書いておきます!!
導入問題
現在、商品表(t_app_mall)と賞品番号表(t_app_mall_no)があります.商品表に商品レコードを1つ追加すると、商品表の参加者数のフィールドに基づいて、対応する数の賞品番号を生成し、賞品番号表にループします!△賞品番号表の商品idは発表された商品に対応しています.多対一の関係です!)商品を発表するたびに設定された参加者数が異なるため、ある商品を発表する際に設定された参加者数が多すぎる場合、賞品番号表にデータを循環挿入するのに時間がかかります.リクエストが同期されるたびに、ユーザの待ち時間が増加します.ユーザーに対して相対的に友好的ではありません!
改善案
毎回insert/updateの後に賞品番号表に対応数のデータを挿入する必要があることを考慮し(updateの場合、ユーザーが商品情報を変更する際に参加者が必要でない場合は、t_app_mall_noを変更する必要はありません)、MySQLのトリガを使用してこの機能を実現できます!
MySQLトリガについて
定義:トリガは、テーブル操作に関連するデータベース・オブジェクトで、トリガが存在するテーブルに指定されたイベントが発生すると、そのオブジェクト、すなわちテーブルの操作イベントが発表されたトリガの実行にトリガーされます.基本テンプレート:
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt
BEGIN
[statement_list]
END
説明:trigger_name:トリガ名を識別し、ユーザーが自分で指定します.trigger_time:トリガタイミングを識別し、BEFOREまたはAFTERの値をとる.trigger_event:INSERT、UPDATEまたはDELETEの値を持つトリガイベントを識別します.tbl_name:トリガを確立するテーブル名、すなわち、どのテーブルにトリガを確立するかを識別します.trigger_stmt:フリップフロップ・プログラム・ボディ.SQL文またはBEGINとENDに含まれる複数の文です.
このことから、BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETEの6種類のトリガを確立することができる.
もう1つの制限は、同じタイプのトリガを1つのテーブルに同時に2つ作成できないため、1つのテーブルに最大6つのトリガを作成することです.
フリップフロップの作成
1.書き込み時トリガタイマ
CREATE TRIGGER `insert_num_no` AFTER INSERT ON `t_app_mall` FOR EACH ROW
BEGIN
--
DECLARE num int (11);
--
DECLARE base int (11);
DECLARE x int (11);
set num = (select mall_participate from t_app_mall where id = new.id);
set x = 0;
set base = 10000001;
if(num>0) then
while x < num do
insert into t_app_mall_no
(mall_id,
mall_num,
num_status,
create_time,
update_time)
values
(new.id,
10000001+x,
0,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP);
set x=x+1;
end while ;
end if;
END;
2.商品表を更新し、参加人数が変更されたかどうかを判断する
CREATE TRIGGER `update_num_no` AFTER UPDATE ON `t_app_mall` FOR EACH ROW BEGIN
--
DECLARE base int(11);
-- update
DECLARE old_num int(11);
DECLARE new_num int(11);
--
set old_num = old.mall_participate;
set new_num = new.mall_participate;
if(old_num != new_num) then
DELETE FROM t_app_mall_no where mall_id = new.id;
--
set base = 0;
while base < new_num do
insert into t_app_mall_no
(mall_id,
mall_num,
num_status,
create_time,
update_time)
values
(new.id,
10000001+base,
0,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP);
set base = base +1;
end while;
end if;
END;
ここまで書いておきます!!