适用于Mysql的Code进行自动分区方法

适用于Mysql的Code进行自动分区方法

首先得实现执行动态sql的方法

此方法仅适用于同一数据库下的公共方法
动态sql的xml如下:

<select id="implementSql" parameterType="String" resultType="java.util.HashMap">
    ${_parameter}
</select>

传入参数为需要执行的sql即可


动态分区实现

直接上代码

/**
     * 表增加分区
     * @param dbName 数据库名称
     * @param tbName 表名
     * @param parDate 数据日期(yyyy-MM-dd)
     */
    public static void AddDbPartitions(String dbName,String tbName,String parDate){
        String parName = "P" + DateUtils.getMonth2ByYMD(parDate);
        String lenss = DateUtils.getMonthByYMD(DateUtils.getDateAddMonth(DateUtils.strConvertDate(parDate,DateUtils.DATE_PATTERN),1)) + "-01";

        Map<String,String> params = new HashMap<>();

        // 查询是否已存在分区
        String sql = "SELECT * FROM INFORMATION_SCHEMA.PARTITIONS \n" +
                "WHERE TABLE_SCHEMA='"+dbName+"' AND TABLE_NAME = '"+tbName+"' AND PARTITION_NAME = '"+parName+"'";
        params.put("sql",sql);
        List<Map<String,Object>> result = utils.services.implementSql(params);
        if (CommonUtils.isNullOrEmpty(result))
        {
            // 指定分区下没有分区
            // 查询其它分区信息
            sql = "SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='"+dbName+"' AND TABLE_NAME = '"+tbName+"'  LIMIT 1";
            params.put("sql",sql);
            result = utils.services.implementSql(params);
            if (!CommonUtils.isNullOrEmpty(result)) {
                Map<String, Object> parMap = result.get(0);

                // 分区类型
                String method = parMap.get("PARTITION_METHOD").toString();
                // 分区字段
                String EXPRESSION = parMap.get("PARTITION_EXPRESSION").toString();

                // 删除分区:ALTER TABLE tb1 DROP PARTITION p1;

                /*
                ALTER TABLE `bx-business-center`.bs_dispatch_shift ADD partition
                (
                    partition P202105 values less than (TO_DAYS('2021-06-01'))
                );
                */
                // 增加分区
                sql = "ALTER TABLE `"+dbName+"`." + tbName + " ADD partition \n" +
                        "(\n" +
                        "\tpartition "+parName+" values less than (TO_DAYS('"+lenss+"'))\n" +
                        ")";
                params.put("sql",sql);
                result = utils.services.implementSql(params);
            }
         /*   else
            {
                // 无分区,增加首个分区,默认按create_tiem进行分区
                *//*
                ALTER TABLE `bx-business-center`.bs_dispatch_shift partition by range(to_days(create_time))
                (
                    partition P202104 values less than (TO_DAYS('2021-05-01'))
                );
                * *//*
                sql = "ALTER TABLE `"+dbName+"`." + tbName + " partition by range(to_days(create_time)) \n" +
                        "(\n" +
                        "\tpartition "+parName+" values less than (TO_DAYS('"+lenss+"'))\n" +
                        ")";
                result = utils.services.implementSql(sql);
            }*/
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值