`

MYSQL存储过程处理表字段数据更新及索引

阅读更多
如题实现如下功能:
  • 表字段修改
  • 数据更新
  • 索引创建

DROP PROCEDURE if EXISTS create_column_index_for_xh_track_path_tb;

CREATE PROCEDURE create_column_index_for_xh_track_path_tb()
BEGIN
# 定义变量名称
DECLARE dbname VARCHAR(200) DEFAULT 'xht_ywp';
DECLARE tbname VARCHAR(200);
## 定义查询变量
DECLARE cursor_ CURSOR FOR 
         # 注意这里的正则匹配结尾是手机号注册的分表
         SELECT TABLE_NAME from information_schema.`TABLES` WHERE TABLE_NAME REGEXP "^xh_track_path_tb_[1][35678][0-9]{9}$";
# 打开游标
OPEN cursor_;
# 游标赋值
FETCH cursor_ into tbname;

my_tables_loop:LOOP
    # 获取单位编码
    SET @dwcode='';
    SET @dwcode_select=CONCAT('SELECT RIGHT("',tbname,'",11) INTO @dwcode');
    PREPARE dwcode_select FROM 	@dwcode_select;
    EXECUTE dwcode_select;
    # 查询是否可以修改
    SET @enable_alter = 0;
    SET @selec = CONCAT('SELECT count(*) INTO @enable_alter	FROM	information_schema.COLUMNS	WHERE		table_schema = "',dbname,'"	AND table_name = "',tbname,'"	AND column_name in ("STARTDATE","STOPDATE","NSJGID")');
    PREPARE selec FROM 	@selec;
    EXECUTE selec;
   
    # 可执行时执行修改
    IF (@enable_alter = 0 AND LENGTH(@dwcode)=11 AND tbname <> '' ) THEN
          # 开启事务处理
          START TRANSACTION;
          # ---------------------------------------新增分表字段------------------------
					# 新增修改字段语句
					SET @mysql_alter_startdate_column=CONCAT('ALTER TABLE ',tbname,' ADD STARTDATE DATETIME');
					PREPARE mysql_alter_startdate_column FROM	@mysql_alter_startdate_column;
					SET @mysql_alter_stopdate_column=CONCAT('ALTER TABLE ',tbname,' ADD STOPDATE DATETIME');
					PREPARE mysql_alter_stopdate_column FROM	@mysql_alter_stopdate_column;
					SET @mysql_alter_nsjgid_column=CONCAT('ALTER TABLE ',tbname,' ADD NSJGID VARCHAR(200)');
					PREPARE mysql_alter_nsjgid_column FROM	@mysql_alter_nsjgid_column;
          # 更新字段
	        EXECUTE mysql_alter_startdate_column;
          EXECUTE mysql_alter_stopdate_column;
          EXECUTE mysql_alter_nsjgid_column;

					# ---------------------------------------更新缺省数据------------------------
					# 更新日期字段的值
					SET @mysql_update_date_data=CONCAT('UPDATE ',tbname,' SET STARTDATE=DATE_FORMAT(START_TIME,"%Y-%m-%d 00:00:00"),STOPDATE=DATE_FORMAT(STOP_TIME,"%Y-%m-%d 00:00:00") WHERE (STARTDATE IS NULL) OR (STOPDATE IS NULL)');
					PREPARE mysql_update_date_data FROM	@mysql_update_date_data;
					# 更新组织机构数据
					SET @mysql_update_nsjg_data=CONCAT('UPDATE ',tbname,' A SET A.NSJGID=(SELECT B.NSJGID FROM XH_HLY_TB_',@dwcode,' B WHERE A.HLY_ID=B.HLY_ID) WHERE A.NSJGID IS NULL');
					PREPARE mysql_update_nsjg_data FROM	@mysql_update_nsjg_data;
          # 更新数据
          EXECUTE mysql_update_date_data;
          EXECUTE mysql_update_nsjg_data;
					# ---------------------------------------新增分表索引------------------------
					# 创建表对应索引列
					SET @mysql_create_hly_index=CONCAT('ALTER TABLE ',tbname,' ADD INDEX HLY_ID(HLY_ID)');
					PREPARE mysql_create_hly_index FROM	@mysql_create_hly_index;
					SET @mysql_create_startdate_index=CONCAT('ALTER TABLE ',tbname,' ADD INDEX STARTDATE(STARTDATE)');
					PREPARE mysql_create_startdate_index FROM	@mysql_create_startdate_index;
					SET @mysql_create_stopdate_index=CONCAT('ALTER TABLE ',tbname,' ADD INDEX STOPDATE(STOPDATE)');
					PREPARE mysql_create_stopdate_index FROM	@mysql_create_stopdate_index;
          # 创建索引
          EXECUTE mysql_create_hly_index;
					EXECUTE mysql_create_startdate_index;
					EXECUTE mysql_create_stopdate_index;
          # 提交事务
          COMMIT;
          # 赋值下一个游标
	  FETCH cursor_ INTO tbname;
    ELSEIF (@enable_alter = 0 AND LENGTH(@dwcode)<>11 AND tbname <> '')  THEN
          # 赋值下一个游标
	  FETCH cursor_ INTO tbname;
          #继续迭代
          iterate my_tables_loop;
    ELSE
          # 离开循环
          leave my_tables_loop;
    END IF;

end LOOP my_tables_loop;

CLOSE cursor_;

END

分享到:
评论

相关推荐

    MySQL中字符串索引对update的影响分析

    但对于update操作,所耗的时间却急剧上升,主要原因是在更新数据的同时,mysql会执行索引的更新。 下面做了一个简单的试验。 (1)首先对某个亿级记录的表字段所有记录执行更新: for idx in range(1, count+1): sql ...

    mysql数据库的基本操作语法

    9、 添加表字段 添加单列 alter table user add tel varchar(11) default ‘02012345678’; 添加多列 alter table user add ( photo blob, birthday date ); 上面就同时增加了多列字段 10、 修改表字段 修改tel列...

    mysql数据库开发规范【推荐】

    最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库。...(1)MySQL有配置参数lower_case_table_names=1,即库表名以小写存储,大小写不敏感。如果是0,则库表名以实际情况

    数据库设计规范.pdf

    如果遇到EMOJ等表情符号的存储需求,可申请使⽤UTF8MB4字符集 2.3 所有表都要添加注释,除主键外的字段都需要添加注释 类status型需指明主要值的含义,如'0-离线,1-在线' 2.4 控制单表字段数量 单表字段数上限30...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例148 使用事件分配线程更新Swing控件 193 实例149 使用SwingWorker类完成耗时操作 194 第7章 反射与异常处理 195 7.1 反射的基础 196 实例150 实例化Class类的5种方式 196 实例151 获得Class对象表示实体的名称 ...

    数据库设计命名规范.docx

    修订记录 时间 版本 修改点 修改人 目 录 1 目的 3 2 数据库名命名规范 3 3 数据库表命名规范 3 4 表字段命名规范 4 5 表设计规范 4 6 索引命名规范 5 7 主键、外键命名规范 5 目的 此规范包括数据库名命名规范、...

    CRM:SSM框架构建的CRM客户管理系统

    数据库名称=工程名称CRM_16 表设计: 表字符:utf-8、utf8 表字段: 主键、bigint(20) 自增、(32) UUID、不能为空 索引: 外键、关联字段、查询比较频繁的字段 单表:500M、索引个数16个 临时表、存储过程、视图...

    数据库设计模板.docx

    4 逻辑设计 3 5 物理设计 4 5.1 表汇总 4 5.2 表[X]:[XXX表] 4 5.3 视图的设计 6 5.4 存储过程、函数及触发器的设计 6 6 安全性设计 6 6.1 防止用户直接操作数据库的方法 6 6.2 用户帐号密码的加密方法 7 6.3 角色...

Global site tag (gtag.js) - Google Analytics