mysql存储过程执行ddl语句

根据业务需要,需要在存储过程自动创建表

CREATE 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`) "即可。

转载于:https://www.cnblogs.com/yubin-jia/p/6816011.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值