1. 程式人生 > >mysql儲存過程批量建立表

mysql儲存過程批量建立表

要求:每個月建立一張表,格式為xxxx_yyyymm.

以下例子從202101建立到203012 .

DELIMITER $$
CREATE DEFINER = `root`@`localhost` PROCEDURE `createTablePro`()
BEGIN
#批量建立表
DECLARE v_i INT(11);
DECLARE v_year INT(11);

DECLARE v_createTime varchar(32);

SET v_i = 1;
SET v_year = 2021;
#set v_createTime ='202001';

while v_year<2030 do
 while v_i <=12 do 
    if v_i<10 THEN
       set v_createTime=CONCAT(v_year,'0',v_i);
     ELSE
       set v_createTime=CONCAT(v_year,v_i);
    END if;
    #set v_createTime=CONCAT(v_year,v_i);

set @createSql = CONCAT('CREATE TABLE IF NOT EXISTS smp_equip_realtimedata_',v_createTime,
'( `id` varchar(64) NOT NULL COMMENT \'主鍵\',
  `create_by` varchar(64) DEFAULT NULL COMMENT \'建立者\',
  `create_date` datetime DEFAULT NULL COMMENT \'建立時間\',
  `update_by` varchar(64) DEFAULT NULL COMMENT \'更新者\',
  `update_date` datetime DEFAULT NULL COMMENT \'更新時間\',
  `remarks` varchar(255) DEFAULT NULL COMMENT \'備註資訊\',
  `del_flag` varchar(64) DEFAULT NULL COMMENT \'邏輯刪除標記(0:顯示;1:隱藏)\',
  `equip_id` varchar(64) DEFAULT NULL COMMENT \'裝置ID\',
  `equip_code` varchar(64) DEFAULT NULL COMMENT \'裝置編號\',
  `equip_name` varchar(64) DEFAULT NULL COMMENT \'裝置名稱\',
  `equip_type` varchar(64) DEFAULT NULL COMMENT \'裝置型別\',
  `func_code` varchar(8) DEFAULT NULL COMMENT \'功能碼\',
  `data_lenth` int(11) DEFAULT NULL COMMENT \'資料長度\',
  `uv_a` decimal(6,2) DEFAULT NULL COMMENT \'A相電壓\',
  `uv_b` decimal(6,2) DEFAULT NULL COMMENT \'B相電壓\',
  `uv_c` decimal(6,2) DEFAULT NULL COMMENT \'C相電壓\',
  `ia_a` decimal(8,4) DEFAULT NULL COMMENT \'A相電流\',
  `ia_b` decimal(8,4) DEFAULT NULL COMMENT \'B相電流\',
  `ia_c` decimal(8,4) DEFAULT NULL COMMENT \'C相電流\',
  `leakage_current` decimal(8,1) DEFAULT NULL COMMENT \'漏電流\',
  `temperature_i` decimal(8,1) DEFAULT NULL COMMENT \'溫度1\',
  `temperature_ii` decimal(8,1) DEFAULT NULL COMMENT \'溫度2\',
  `temperature_iii` decimal(8,1) DEFAULT NULL COMMENT \'溫度3\',
  `temperature_iv` decimal(8,1) DEFAULT NULL COMMENT \'溫度4\',
  `ta_trans_ratio` decimal(8,1) DEFAULT NULL COMMENT \'電路變比\',
  `alarm_leakage_current` char(1) DEFAULT NULL COMMENT \'漏電報警\',
  `alarm_overload` char(1) DEFAULT NULL COMMENT \'過載報警\',
  `alarm_short_circuit` char(1) DEFAULT NULL COMMENT \'短路報警\',
  `alarm_overvoltage` char(1) DEFAULT NULL COMMENT \'過壓報警\',
  `alarm_under_voltage` char(1) DEFAULT NULL COMMENT \'欠壓報警\',
  `alarm_broken_circuit` char(1) DEFAULT NULL COMMENT \'斷路報警\',
  `alarm_open_phase` char(1) DEFAULT NULL COMMENT \'缺相報警\',
  `alarm_phase_stagger` char(1) DEFAULT NULL COMMENT \'錯相報警\',
  `alarm_electric_arc` char(1) DEFAULT NULL COMMENT \'電弧報警\',
  `alarm_smoke_detector` char(1) DEFAULT NULL COMMENT \'煙感報警\',
  `alarm_flammable_gas` char(1) DEFAULT NULL COMMENT \'可燃氣體報警\',
  `alarm_toxic_gas` char(1) DEFAULT NULL COMMENT \'有毒氣體報警\',
  `alarm_temp_i` char(1) DEFAULT NULL COMMENT \'溫度1報警\',
  `alarm_temp_ii` char(1) DEFAULT NULL COMMENT \'溫度2報警\',
  `alarm_temp_iii` char(1) DEFAULT NULL COMMENT \'溫度3報警\',
  `alarm_temp_iv` char(1) DEFAULT NULL COMMENT \'溫度4報警\',
  `di1` char(1) DEFAULT NULL ,
  `di2` char(1) DEFAULT NULL ,
  `di3` char(1) DEFAULT NULL ,
  `di4` char(1) DEFAULT NULL ,
  `di5` char(1) DEFAULT NULL ,
  `di6` char(1) DEFAULT NULL ,
  `di7` char(1) DEFAULT NULL ,
  `di8` char(1) DEFAULT NULL ,
  `do1` char(1) DEFAULT NULL ,
  `do2` char(1) DEFAULT NULL ,
  `do3` char(1) DEFAULT NULL ,
  `do4` char(1) DEFAULT NULL ,
  `do5` char(1) DEFAULT NULL ,
  `do6` char(1) DEFAULT NULL ,
  `do7` char(1) DEFAULT NULL ,
  `do8` char(1) DEFAULT NULL ,
  `data_time` datetime DEFAULT NULL COMMENT \'資料時間\',
  `fault_leakage_current` char(1) DEFAULT NULL COMMENT \'漏電故障\',
  `fault_temp_i` char(1) DEFAULT NULL COMMENT \'溫度1故障\',
  `fault_temp_ii` char(1) DEFAULT NULL COMMENT \'溫度2故障\',
  `fault_temp_iii` char(1) DEFAULT NULL COMMENT \'溫度3故障\',
  `fault_temp_iv` char(1) DEFAULT NULL COMMENT \'溫度4故障\',
  `pt` decimal(8,1) DEFAULT NULL COMMENT \'PT變比\',
  `active_energy` decimal(20,2) DEFAULT \'0.00\' COMMENT \'有功電能\',
  `reactive_energy` decimal(20,2) DEFAULT \'0.00\' COMMENT \'無功電能\',
  PRIMARY KEY (`id`),
  KEY `serd_create_date_in` (`create_date`) USING BTREE,
  KEY `serd_equip_id_in` (`equip_id`) USING BTREE,
  KEY `serd_equip_code_in` (`equip_code`) USING BTREE,
  KEY `serd_equip_name_in` (`equip_name`) USING BTREE,
  KEY `serd_data_time_in` (`data_time`) USING BTREE,
  KEY `index_codeAndDate` (`create_date`,`equip_code`),
  KEY `index_codeAndTime` (`equip_code`,`data_time`),
  KEY `index_uva` (`uv_a`) USING BTREE,
  KEY `index_uvb` (`uv_b`) USING BTREE,
  KEY `index_uvc` (`uv_c`) USING BTREE,
  KEY `index_iaa` (`ia_a`) USING BTREE,
  KEY `index_iab` (`ia_b`) USING BTREE,
  KEY `index_iac` (`ia_c`) USING BTREE,
  KEY `index_temperaturei` (`temperature_i`) USING BTREE,
  KEY `index_temperatureii` (`temperature_ii`) USING BTREE,
  KEY `index_temperature_iii` (`temperature_iii`) USING BTREE,
  KEY `index_leakage_current` (`leakage_current`) USING BTREE,
  KEY `index_temperature_iv` (`temperature_iv`) USING BTREE,
  KEY `update_date_da` (`update_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=\'裝置實時資料\';'
);

  prepare stmt from @createSql;
  execute stmt;

SET v_i= v_i+1; 
#select DATE_FORMAT((select  DATE_ADD((select STR_TO_DATE(CONCAT(v_createTime,'01'), '%Y%m%d')),INTERVAL 1 MONTH)),'%Y%m') into v_createTime;
            END WHILE;
SET v_i = 1;
SET v_year= v_year+1; 

 END WHILE;
END$$
DELIMITER ;