mysqlスクリプト作成--トリガ、ストレージ・プロシージャ、タイミング・タスク

11483 ワード

最近、統計データを表示するページがあり、システムのデータを統計する必要があるため、mysqlスクリプトでデータの自動統計ストレージを実現するいくつかのテーブルが新たに生成されました.mysqlのすべてのスクリプトで作成された類似の説明マニュアルの内容が見つからないため、問題ごとに個別に検索して作成するしかありません.
一、フリップフロップによるデータテーブルのデータ挿入を実現する場合、それに応じて統計テーブルに更新する.
詳細なトリガの説明は前の文章を見てください.ここで私が書いたものを貼ってください.ローを挿入するたびに、別のテーブルの統計が更新されます.
DROP TRIGGER IF EXISTS `update_alert_count`;
delimiter ;;
CREATE TRIGGER `update_alert_count` AFTER INSERT ON `eagle_alert_data` FOR EACH ROW begin
    if((NEW.app_id,NEW.site,DATE(NEW.time)) not in (select DISTINCT app_id,site,DATE(time) from eagle_alert_count_by_app)) then
        insert into eagle_alert_count_by_app(app_id,time,count,site) values(NEW.app_id,DATE(NEW.time),1,NEW.site);  
    else
        UPDATE eagle_alert_count_by_app set count=count+1 where app_id=NEW.app_id and site= NEW.site and DATE(time)=DATE(NEW.time);
    end if;
end
;;
delimiter ;

二、タイミングタスク更新データテーブル
実現機能は、1日1時に1つのテーブルから昨日のデータを取り出し、システムに格納されている過去最大のテーブルと比較し、より大きくなれば更新する.
1、保存中にselectデータセットを読み出して循環処理を行う
あるテーブルの複数のローデータを読み出し、判断を経て別のテーブルを挿入または更新する機能を実現するストレージ・プロシージャが必要です.pythonのfetch後のforループに似ています.ネット検索後、カーソルで実現します.(参考:https://bbs.csdn.net/topics/370065921)
例:
CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE a CHAR(16);
  DECLARE b,c INT;
  DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
  DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  OPEN cur1;
  OPEN cur2;

  REPEAT
    FETCH cur1 INTO a, b;
    FETCH cur2 INTO c;
    IF NOT done THEN
       IF b < c THEN
          INSERT INTO test.t3 VALUES (a,b);
       ELSE
          INSERT INTO test.t3 VALUES (a,c);
       END IF;
    END IF;
  UNTIL done END REPEAT;

  CLOSE cur1;
  CLOSE cur2;
END

個人的には、doneは完全部データを読み出すか否かを定義するためのフラグビットである.FETCHは、1行のデータを読み出して対応する値に割り当てられ、REPEATはループである.
2、ストアドプロセスコード
DELIMITER //
DROP PROCEDURE IF EXISTS alert_count_max_compare//
CREATE PROCEDURE alert_count_max_compare() 
BEGIN
    DECLARE done INT DEFAULT 0;#        
    DECLARE m_app_id VARCHAR(50);
    DECLARE m_site VARCHAR(20);
    DECLARE m_count INT;
    DECLARE m_time datetime(6);
    DECLARE cur1 CURSOR FOR SELECT app_id,site,count,time FROM eagle_alert_count_by_app WHERE CURDATE()-DATE(time) =1 order by app_id;#                   
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN cur1;

    REPEAT
        FETCH cur1 INTO m_app_id,m_site,m_count,m_time;#                   
        IF NOT done THEN #         ,      
            if((m_app_id,m_site) not in (select DISTINCT app_id,site from eagle_alert_count_max)) then #ifthenbegin end   (                ,       )
                insert into eagle_alert_count_max(app_id,site,max_count,time) values(m_app_id,m_site,m_count,DATE(m_time)); 
            ELSE
                SELECT max_count INTO @count_data FROM eagle_alert_count_max WHERE app_id=m_app_id and site=m_site; #   INTO @count_data         ,        selectif m_count>@count_data then
                    UPDATE eagle_alert_count_max set max_count=m_count,time=DATE(m_time) where app_id=m_app_id and site=m_site;
                end if; #   if     end if
            end if;
        END IF;
    UNTIL done END REPEAT;

    CLOSE cur1;

END//

information_schema.Routinesテーブルでは、CALL alert_を使用してストレージ・プロシージャの定義に成功したかどうかを確認します.count_max_compare();ストレージ・プロシージャが正しいかどうかをテストします.
3、タイミングタスクの作成
タイミングタスクを実行するイベントを定義します(参照:https://www.cnblogs.com/laowu-blog/p/5073665.html,https://www.cnblogs.com/it-aaron/p/6756924.html,https://www.cnblogs.com/ctaixw/p/5660531.html)
DROP EVENT IF EXISTS alert_count_max_compare_job;
delimiter $$
CREATE EVENT alert_count_max_compare_job
ON SCHEDULE EVERY 1 day STARTS TIMESTAMP '2018-08-14 01:00:00' #   1 day'2018-08-14 01:00:00'         
ON COMPLETION PRESERVE #    event   ,event  disable,   event     
DO
BEGIN
CALL alert_count_max_compare(); #      
end  $$
delimiter ;

4、タイミングタスクのオープン
イベントが開いているかどうかを確認:SHOW VARIABLES LIKE'%event_sche%’; イベント計画を開く:SET GLOBAL event_scheduler = 1; オープンイベントタスク:ALTER EVENT eventName ON COMPLETION PRESERVE ENABLE;イベントタスクの表示:SHOW EVENTS;
閉じる必要がある場合は、次のコマンドを使用します.
イベント計画を閉じる:SET GLOBAL event_scheduler = 0; イベントタスクを閉じる:ALTER EVENT eventName ON COMPLETION PRESERVE DISABLE;
その他のスクリプト作成時の内容1、mysql設定一意制約ALTER TABLE eagle_alert_count_max ADD UNIQUE KEY(app_id,site); これは2つの列が結合して一意であり、1つの列が一意であれば、括弧内のフィールドを1つに変更すればよい.
その他の参考内容:sql文の使い方と関数の使用マニュアルは以下の通りです.http://www.w3school.com.cn/sql/sql_syntax.asp
ストアド・プロシージャの記述説明:1、mysqlストアド・プロシージャ変数とパラメータ・タイプ、https://blog.csdn.net/jxpxlinkui/article/details/79709037ストアド・プロシージャ変数にはmysqlのSQLデータ型と一致するデータ型と長さがあるため、デフォルト値、文字セット、ソート・ルールを指定することもできます.
2、MySQL——ストレージプロセスと関数を表示し、https://blog.csdn.net/qq_41573234/article/details/80411079information_schema.Routinesテーブルでのストアド・プロシージャの表示