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

最新更新