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