适用于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);
}*/
}
}