MySQLフリップフロップループ書き込み

2666 ワード

MySQLフリップフロップループ書き込み
  • フリップフロップ
  • 導入問題
  • 改良案
  • MySQLトリガ
  • について
  • 作成トリガ
  • フリップフロップ
    導入問題
    現在、商品表(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;
    

    ここまで書いておきます!!