国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

Mysql用存儲過程和事件每月定時創建一張數據庫表

2024-07-24 12:35:58
字體:
來源:轉載
供稿:網友

  業務需求,把app用戶開機寫入一張日志表app_open_log。
  上線7個月來,有74萬條記錄了。
 
  現考慮要分庫分表了。每個月初創建一張以app_open_log_為前綴,日期年月為后綴的數據庫表,比如:app_open_log_201807。
 
  實現思路:
  Mysql如何每月自動建表?
  一、新建事件每月調用存儲過程
  二、存儲過程里面建表
  1、獲取當前時間,轉換字符串
  2、拼接sql語句建表
 
  實現方法
  把下面兩段復制到sql,執行即可。
 
  首先創建存儲過程:
  
  DELIMITER //
  CREATE PROCEDURE create_table_app_open_log_month()
  BEGIN
  DECLARE `@suffix` VARCHAR(15);
  DECLARE `@sqlstr` VARCHAR(2560);
  SET `@suffix` = DATE_FORMAT(DATE_ADD(NOW(),INTERVAL 1 MONTH),'_%Y%m');
  SET @sqlstr = CONCAT(
  "CREATE TABLE jz_app_open_log",
  `@suffix`,
  "(
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `equipment_type` varchar(45) DEFAULT NULL ,
    `equipment_version` varchar(45) DEFAULT NULL ,
    `rom` varchar(45) DEFAULT NULL ,
    `cpu` varchar(45) DEFAULT NULL ,
    `mac` varchar(100) DEFAULT NULL ,
    `ip` varchar(50) DEFAULT NULL ,
    `version_code` varchar(10) DEFAULT NULL ,
    `client` varchar(45) DEFAULT '' ,
    `create_time` int(10) DEFAULT NULL,
    `version_name` varchar(45) DEFAULT '' ,
    `v` varchar(10) DEFAULT '',
    PRIMARY KEY (`id`),
    UNIQUE KEY `id_UNIQUE` (`id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;"
  );
  PREPARE stmt FROM @sqlstr;
  EXECUTE stmt;
  END;
  然后創建事件每月1日執行上面的存儲過程:
 
  DELIMITER $$
  SET GLOBAL event_scheduler = 1;
  CREATE EVENT event_create_table_every_month
  ON SCHEDULE EVERY 1 MONTH
  STARTS '2018-07-01 00:00:00'
  ON  COMPLETION  PRESERVE
  ENABLE
  DO
  BEGIN
  CALL create_table_app_open_log_month();
  END
  通過Navicate可以查看到
  Mysql用存儲過程和事件每月定時創建一張數據庫表
 
  這樣就OK了!
 
  擴展知識:什么是存儲過程?
  在一些語言中,有“過程”這種概念,procedure,和"函數",function,
  PHP中沒有過程,只有函數。
  過程:封裝了若干條語名,調用時,這些封裝體執行。
  函數:是一個有返回值的過程。
  過程:是沒有返回值的函數。
 
  我們把若干條sql封裝起來,取個名字,---過程。
  把此過程存儲在數據庫中,---存儲過程。
 
  存儲過程創建語法:
  定義:
  create procedure procedureName()
  begin
  --sql語句;
  end$
  查看:
  show procedure status;
  調用:
  call procedure()
 
  存儲過程是可以編程的
  即可以用變量,表達式,控制語句來完成復雜的功能。
 
  在存儲過程中,用declare聲明變量
  格式: declare 變量名 變量類型。
 
  例:
 
  create procedure p2()
  begin
  declare age int default 18;
  declare height int default 180;
  select concat('年齡是',age,'身高是',height);
  end$
  有變量,就能運算,有運算,有運算就能控制。
  運算的結果,如何賦值給變量。
  set 變量名:=變量值
 
  例:
 
  create procedure p3()
  begin
  declare age int default 18;
  set age:=age+20;
  select concat(’20年后年齡是’,age);
  end$
  -- if/else控制結構
  if condition then
  statement
  else
  end if;
 
  --p5 給存儲過程傳參
  存儲過程的括號里,可以聲明參數,
  語法是[in/out/inout] 參數名 參數類型
  例:
 
  create procedure p5(width int,height int)
  begin
  select concat('你的面積是',width*height)  as area;
  if width>height then
  select '你很胖';
  else if width<height then
  select '你很瘦';
  else
  select '你很方';
  end if;
  end$
  call p5(3,4)$
 
  重在動手實踐。再有問題,歡迎加入PHP技術問答群提問。謝謝閱讀!
 
  如果您有利他之心,樂于幫助他人,樂于分享
  如果您遇到php問題,百度且問了其他群之后仍沒得到解答
 
  歡迎加入,PHP技術問答群,QQ群:292626152
 
  教學相長!幫助他人,自己也會得到提升!
 
  為了珍惜每個人的寶貴時間,請大家不要閑聊!
 
  愿我們互相幫助,共同進步!
 
  加入時留言暗號,php,ajax,thinkphp,yii...

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江孜县| 彰化市| 怀柔区| 年辖:市辖区| 吐鲁番市| 宁晋县| 泽库县| 龙江县| 兰溪市| 斗六市| 柯坪县| 子洲县| 普兰店市| 贵阳市| 郴州市| 商水县| 武山县| 阜南县| 龙游县| 尼勒克县| 泸州市| 泗阳县| 清原| 阳新县| 松潘县| 栾城县| 闽清县| 昌黎县| 南江县| 泉州市| 和硕县| 南乐县| 左云县| 轮台县| 荥经县| 镇坪县| 永安市| 格尔木市| 安达市| 寿阳县| 海南省|