问题描述
感谢您的关注。 我有一个带有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$$