MySQL是否根据存储过程中传递的id添加新的列表分区?

MySQL是否根据存储过程中传递的id添加新的列表分区?,mysql,partitioning,Mysql,Partitioning,谢谢你看。 我有一个带有列表分区的表。我们需要让每个客户机都位于自己的分区中: 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

谢谢你看。
我有一个带有列表分区的表。我们需要让每个客户机都位于自己的分区中:

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$$

“我们需要让每个客户机都在自己的分区中:”--为什么?有许多可能的答案;有些是假的,谢谢。这就是答案!