1.背景原因

当前MySQL不支持在添加和删除分区时,使用IF NOT EXISTS和IF EXISTS。所以在执行调度任务时,直接通过ADD PARTITION和DROP PARTITION不可避免会报错。本文通过创建存储过程来添加和删除分区,可以避免在分区存在时添加分区报错,或者分区不存在时删除分区报错的问题。

本文介绍的是关于LIST分区的添加和删除。

2.前提准备

创建List分区表

DROP TABLE  IF  EXISTS `list_part_table` ;

CREATE TABLE  IF  NOT  EXISTS `list_part_table`  (
`id` bigint(32) NOT NULL COMMENT '主键',
`request_time` datetime(0) NOT NULL COMMENT '请求时间',
`response_time` datetime(0) NOT NULL COMMENT '响应时间',
`time_used` int(11) NOT NULL COMMENT '耗时(ms)',
`create_by` varchar(48) DEFAULT NULL COMMENT '创建人',
`update_by` varchar(48) DEFAULT NULL COMMENT '修改人',
`create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`, `request_time`) USING BTREE
) PARTITION BY list(TO_DAYS(request_time)) (
PARTITION p0 VALUES IN (0)
) ;

查看表中的分区信息

select  *  from  information_schema.partitions  where table_name like 'list_part_table%' ;

3.添加LIST分区

(1)添加分区的存储过程

DROP  PROCEDURE  IF EXISTS create_list_partition ;

DELIMITER $$

CREATE PROCEDURE  IF  NOT  EXISTS create_list_partition (par_value bigint, tb_schema varchar(128),tb_name varchar(128))

BEGIN

  DECLARE par_name varchar(32);

  DECLARE par_value_str varchar(32);

  DECLARE par_exist int(1);

DECLARE _err int(1);

  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND SET _err = 1;

  START TRANSACTION;

SET par_value_str = CONCAT('', par_value);

    SET par_name = CONCAT('p', par_value);

    SELECT  COUNT(1) INTO par_exist  FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = tb_schema AND TABLE_NAME = tb_name AND PARTITION_NAME = par_name;

    IF (par_exist = 0) THEN

      SET @alter_sql = CONCAT('alter table ', tb_name, ' add PARTITION (PARTITION ', par_name, ' VALUES IN (', par_value_str, '))');

      PREPARE stmt1 FROM @alter_sql;

      EXECUTE stmt1;

    END IF;

  COMMIT;

  END

$$

(2)调用存储过程添加分区

添加分区

CALL create_list_partition(202201, 'test', 'list_part_table');

CALL create_list_partition(202202, 'test', 'list_part_table');

CALL create_list_partition(20230912, 'test', 'list_part_table');

CALL create_list_partition(20230913, 'test', 'list_part_table');

查看表的分区信息

select  * from  information_schema.partitions  where table_name like 'list_part_table%' ;

4.删除LIST分区

(1)删除分区的存储过程

DROP PROCEDURE  IF  EXISTS drop_list_partition ;

DELIMITER $$

CREATE PROCEDURE  IF  NOT  EXISTS drop_list_partition (part_value bigint, tb_schema varchar(128), tb_name varchar(128))

BEGIN

  DECLARE str_day varchar(64);

  DECLARE _err int(1);

  DECLARE done int DEFAULT 0;

  DECLARE par_name varchar(64);

  DECLARE cur_partition_name CURSOR FOR  SELECT  partition_name FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = tb_schema AND table_name = tb_name  ORDER BY partition_ordinal_position;

  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND SET _err = 1;

  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  SET str_day = CONCAT('',part_value);

  OPEN cur_partition_name;

  REPEAT

    FETCH cur_partition_name INTO par_name;

    IF (str_day = SUBSTRING(par_name, 2)) THEN

      SET @alter_sql = CONCAT('alter table ', tb_name, ' drop PARTITION ', par_name);

      PREPARE stmt1 FROM @alter_sql;

      EXECUTE stmt1;

    END IF;

  UNTIL done END REPEAT;

  CLOSE cur_partition_name;

END

$$

(2)调用存储过程删除分区

删除分区

CALL drop_list_partition(202201, 'test', 'list_part_table');

CALL drop_list_partition(202202, 'test', 'list_part_table');

查看表的分区信息

select  * from  information_schema.partitions  where table_name like 'list_part_table%' ;

MySQL-通过存储过程来添加和删除分区(List分区)的更多相关文章

  1. Mysql使用存储过程快速添加百万数据

    前言 为了体现不加索引和添加索引的区别,需要使用百万级的数据,但是百万数据的表,如果使用一条条添加,特别繁琐又麻烦,这里使用存储过程快速添加数据,用时大概4个小时. 创建一个用户表 CREATE TA ...

  2. Linux fdisk命令操作磁盘(添加、删除、转换分区等)

    创建分区1->查看原始分区sudo fdisk -l Disk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, ...

  3. 分享知识-快乐自己:MySQL中的约束,添加约束,删除约束,以及一些其他修饰

    创建数据库: CREATE DATABASES 数据库名: 选择数据库: USE 数据库名: 删除数据库: DROP DATAVBASE 数据库名: 创建表: CREATE TABLE IF NOT ...

  4. MySQL中的约束,添加约束,删除约束,以及其他修饰

    一.NOT NULL(非空约束)添加非空约束 1)建表时直接添加 CREATE TABLE t_user(user_id INT(10) NOT NULL); 2)通过ALTER 语句 ALTER T ...

  5. MySQL 字段常用操作 添加,修改,删除,调整字段顺序

    整理备忘: 添加字段:alter table 表名Add column 字段名 字段类型  默认值 AFTER 字段名 (在哪个字段后面添加) 例子: alter table appstore_sou ...

  6. mysql 如何修改、添加、删除表主键

    在我们使用mysql的时候,有时会遇到须要更改或者删除mysql的主键,我们能够简单的使用alter table table_name drop primary key;来完成.以下我使用数据表tab ...

  7. mysql使用存储过程和event定期删除

    -- 创建存储过程DELIMITER //CREATE PROCEDURE del_data()BEGIN DELETE FROM t_route_status WHERE route_date &l ...

  8. Ansible 从MySQL数据库添加或删除用户

    mysql_user - 从MySQL数据库添加或删除用户. 概要 要求(在执行模块的主机上) 选项 例子 笔记 状态 支持 概要 从MySQL数据库添加或删除用户. 要求(在执行模块的主机上) My ...

  9. Ansible 从远程主机添加或删除MySQL数据库

    mysql_db - 从远程主机添加或删除MySQL数据库. 概要 要求(在执行模块的主机上) 选项 例子 笔记 状态 支持 概要 从远程主机添加或删除MySQL数据库. 要求(在执行模块的主机上) ...

  10. mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)

    字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...

随机推荐

  1. nas盒子内网穿透

    2023年5月27日星期六 -------------------------------------------------------------------------------------- ...

  2. ics-05

    挺有意思的一题 攻防世界->web->ics-05 打开题目链接,就是一个很正常的管理系统,只有左侧的可以点着玩 并且点到**设备维护中心时,页面变为index.php 查看响应 发现云平 ...

  3. Apikit 自学日记:如何安装 Apikit

    肯定会有和我一样的小白,第一次听说 Apikit这个工具,那么我今天和大家一起学习下这个工具如何安装. Apikit 有三种客户端,你可以依据自己的情况选择.三种客户端的数据是共用的,因此你可以随时切 ...

  4. 【PAT】1001 害死人不偿命的(3n+1)猜想(动态更新)

    卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ( 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 年的世界 ...

  5. 企业battle宝典Q1 每一个身处于抑郁与困难的朋友必看!

    里面有看不懂的可以留言,我会解释!

  6. Hugging News #0703: 在浏览器中运行 Whisper 模型、WAIC 分论坛活动邀请报名

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  7. 如何制作 GitHub 个人主页

    人们在网上首先发现你的地方是哪里?也许你的社交媒体是人们搜索你时首先发现的东西,亦也许是你为自己创建的投资组合网站.然而,如果你使用GitHub来分享你的代码并参与开源项目,那么你的GitHub个人主 ...

  8. 【Git】常用命令汇总

    一.仓库管理 git init:本地初始化 git clone:克隆远程仓库 git remote:远程仓库管理 git remote:查看远程仓库的信息 git remote -v:显示更详细的信息 ...

  9. 【转载】Linux虚拟化KVM-Qemu分析(十)之virtio驱动

    原文信息 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者 ...

  10. 「学习笔记」FHQ-treap

    FHQ-treap,即无旋 treap,又称分裂合并 treap,支持维护序列,可持久化等特性. FHQ-treap 有两个核心操作,分裂 与 合并.通过这两个操作,在很多情况下可以比旋转 treap ...