当前位置:Gxlcms > 数据库问题 > mysql存储过程执行ddl语句

mysql存储过程执行ddl语句

时间:2021-07-01 10:21:17 帮助过:22人阅读

PROCEDURE parameter_split(in table_name VARCHAR(30),in start_time BIGINT(16),in end_time BIGINT(16)) BEGIN -- 得到时间 DECLARE table_year VARCHAR(5); DECLARE table_month VARCHAR(3); DECLARE table_day VARCHAR(3); -- 按开始时间设置年月日,并补齐单月为 05 SET table_year = YEAR(FROM_UNIXTIME(start_time/1000)); SET table_month = MONTH(FROM_UNIXTIME(start_time/1000)); SET table_day = DAY(FROM_UNIXTIME(start_time/1000)); IF table_month < 10 THEN SET table_month = CONCAT("0",table_month); SELECT table_month; END IF; IF table_day < 10 THEN SET table_day = CONCAT("0",table_day); SELECT table_day; END IF; -- 设置表名 SET table_name = CONCAT(table_name,table_year,table_month,table_day); -- 创建表语句 IF table_name="t_sg_electric_meter_parameter_data" THEN SET @creat_parameter_table_sql = CONCAT("CREATE TABLE IF NOT EXISTS ",table_name, " (`id` int(11) NOT NULL auto_increment,", "`data_type` varchar(255) default NULL,", "`freq` double default NULL,", "`lineVoltage_A` double default NULL,", "`lineVoltage_B` double default NULL,", " `lineVoltage_C` double default NULL,", "`phaseCurrent_A` double default NULL,", "`phaseCurrent_B` double default NULL,", "`phaseCurrent_C` double default NULL,", " `phaseVoltage_A` double default NULL,", "`phaseVoltage_B` double default NULL,", "`phaseVoltage_C` double default NULL,", "`timestamp` datetime default NULL,", "`electric_meter_id` int(11) default NULL,", "`timestamp_long` bigint(14) default NULL,", "PRIMARY KEY (`id`),", "KEY `FK_6xa5d3kb1j2cnhw4skdg9nlq9` (`electric_meter_id`),", "KEY `index_name` (`timestamp_long`),", "FOREIGN KEY (`electric_meter_id`) REFERENCES `t_sg_electric_meter` (`id`)", ") ENGINE=InnoDB AUTO_INCREMENT=5184520 DEFAULT CHARSET=utf8;" ); -- 创建插入语句 SET @insert_data_sql = CONCAT("INSERT INTO ",table_name," (data_type,freq,lineVoltage_A,lineVoltage_B,lineVoltage_C,phaseCurrent_A,phaseCurrent_B,", "phaseCurrent_C,phaseVoltage_A,phaseVoltage_B,phaseVoltage_C,timestamp,electric_meter_id,timestamp_long) SELECT data_type,freq,lineVoltage_A,lineVoltage_B,lineVoltage_C,phaseCurrent_A,phaseCurrent_B,", "phaseCurrent_C,phaseVoltage_A,phaseVoltage_B,phaseVoltage_C,timestamp,electric_meter_id,timestamp_long from t_sg_electric_meter_parameter_data WHERE timestamp_long BETWEEN ", start_time," AND ",end_time); -- 创建删除数据的语句 SET @delete_data_sql = CONCAT("DELETE FROM t_sg_electric_meter_parameter_data WHERE timestamp_long BETWEEN ",start_time," AND ",end_time); ELSEIF table_name="t_sg_electric_meter_demand_data" THEN SET @creat_demand_table_sql = CONCAT("CREATE TABLE IF NOT EXISTS ",table_name, " (`id` int(11) NOT NULL auto_increment,", "`active_demand` double default NULL,", "data_type` varchar(255) default NULL,", "`reactive_demand` double default NULL,", "`timestamp` datetime default NULL,", "`total_demand` double default NULL,", "`electric_meter_id` int(11) default NULL,", "`timestamp_long` bigint(14) default NULL,", "PRIMARY KEY (`id`),", "KEY `index_electric_meter_id` (`electric_meter_id`),", "KEY `index_timestamp_long` (`timestamp_long`),", "FOREIGN KEY (`electric_meter_id`) REFERENCES `t_sg_electric_meter` (`id`)", ") ENGINE=InnoDB AUTO_INCREMENT=2017227 DEFAULT CHARSET=utf8;" ); END IF; -- 执行创建表语句 PREPARE c_day_stmt FROM @creat_table_sql; EXECUTE c_day_stmt; -- 执行插入数据语句 PREPARE i_parameter_day_stmt FROM @insert_data_sql; EXECUTE i_parameter_day_stmt; -- 执行删除语句 PREPARE d_parameter_day_stmt FROM @delete_data_sql; EXECUTE d_parameter_day_stmt; END;

此处需要注意的地方就是

  1、PREPARE c_day_stmt FROM @creat_table_sql;  FROM后边只能跟上用户变量。

  2、还有一个问题是从navicat张贴过来的DDL语句是不正确的。这里是针对mysql

      

CREATE TABLE `parameter20170228` (
  `id` int(11) NOT NULL auto_increment,
  `data_type` varchar(255) default NULL,
  `freq` double default NULL,
  `lineVoltage_A` double default NULL,
  `lineVoltage_B` double default NULL,
  `lineVoltage_C` double default NULL,
  `phaseCurrent_A` double default NULL,
  `phaseCurrent_B` double default NULL,
  `phaseCurrent_C` double default NULL,
  `phaseVoltage_A` double default NULL,
  `phaseVoltage_B` double default NULL,
  `phaseVoltage_C` double default NULL,
  `timestamp` datetime default NULL,
  `electric_meter_id` int(11) default NULL,
  `timestamp_long` bigint(14) default NULL,
  PRIMARY KEY  (`id`),
  KEY `FK_6xa5d3kb1j2cnhw4skdg9nlq9` (`electric_meter_id`),
  KEY `index_name` (`timestamp_long`),
  CONSTRAINT `parameter20170228_ibfk_1` FOREIGN KEY (`electric_meter_id`) REFERENCES `t_sg_electric_meter` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5335200 DEFAULT CHARSET=utf8;

这一段是copy的DDL语句,然而,这样直接运行是不行的,需要把" CONSTRAINT `parameter20170228_ibfk_1` FOREIGN KEY (`electric_meter_id`) REFERENCES `t_sg_electric_meter` (`id`)  "。

开头的  CONSTRAINT `parameter20170228_ibfk_1` 去除  "FOREIGN KEY (`electric_meter_id`) REFERENCES `t_sg_electric_meter` (`id`) "即可。

mysql存储过程执行ddl语句

标签:else   去除   param   parameter   not   时间设置   key   where   select   

人气教程排行