MySQL根据存储​​的过程中传递的ID添加新的LIST分区?

问题描述

感谢您的关注。 我有一个带有LIST分区的表。我们需要将每个客户端都放在自己的分区中:

CREATE TABLE `mydb`.`test` (
`client_id` INT NOT NULL,`client_name` VARCHAR(45) NULL,PRIMARY KEY (`client_id`));

ALTER TABLE test PARTITION BY LIST (client_id)
(partition p100 values in (100),partition p101 values in (101));

我正在尝试创建一个存储过程,以便在创建新客户端时调用该存储过程:

DELIMITER $$
USE `mydb`$$
CREATE PROCEDURE `util_partioning_partition_new`(IN p_client_id INT)
BEGIN
DECLARE partition_name varchar(25);
select CONCAT('p',p_client_id) into partition_name;
ALTER TABLE test ADD PARTITION (PARTITION partition_name values in (p_client_id));
END$$

DELIMITER ;
;

并收到此错误错误1064 :(子)分区函数中的常量,随机或时区相关表达式不允许'p_client_id));

请帮助!如何将客户端ID传递给()中的值?

在此先感谢

一个论坛上的某人(对交叉发布表示抱歉)建议使用PREPARE。

所以我尝试了以下操作,但得到了错误代码:1564 。不允许使用此分区功能

DELIMITER $$
USE `mydb`$$

CREATE PROCEDURE `util_partioning_partition_new`(IN p_client_id INT)
BEGIN
DECLARE partition_name varchar(25);
SELECT CONCAT('p',p_client_id) INTO partition_name;

PREPARE stmt1 FROM 'ALTER TABLE test ADD PARTITION (PARTITION partition_name VALUES IN (?));';
SET @nid = p_client_id;

EXECUTE stmt1 USING @nid;
DEALLOCATE PREPARE stmt1;

END$$

DELIMITER ;
;

解决方法

变量未在ALTER TABLE语句中扩展。

您只能在允许表达式的地方使用占位符,但是ALTER TABLE中的参数必须是常量。

因此,您必须使用串联将所有动态值放入语句中。

CREATE PROCEDURE `util_partioning_partition_new`(IN p_client_id INT)
BEGIN
    DECLARE partition_name varchar(25);
    SET partition_name = CONCAT('p',p_client_id);
    SET @sql = CONCAT('ALTER TABLE test ADD PARTITION (PARTITION ',partition_name,' VALUES in (',p_client_id,'))';
    PREPARE stmt1 FROM @sql;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
END$$