使用触发器创建分区

问题描述 投票:0回答:1

Mysql 5.6 中是否可以使用触发器自动为现有表创建新分区的过程?

我有两个表表A和表B。我需要根据列ID对表B进行列表分区。如果在表 A 中插入新列,我需要自动执行使用新 ID 在表 B 中创建分区的过程。

**Table A            Table B
ID                 ID 
1                  1
2                  2
3** 

现在我需要自动化为表 B 中的 Id 值 3 创建分区的过程,以便在表 B 中插入记录时不会抛出错误。

mysql partitioning mysql-5.6
1个回答
0
投票

可以创建一个存储过程来在运行时创建分区,但可以通过调用该存储过程并在其中运行dynamicSQL来创建具有自定义名称的新分区。

您可以通过以下示例来理解这一点,其中我们根据日期动态创建销售表分区(这是按日获取数据的非常常见的任务)

Let the table definition :

创建销售表( customer_id int NOT NULL, 客户名称 varchar(40), store_id varchar(20) NOT NULL, bill_number int NOT NULL, bill_date日期主键不为空, 金额小数(8, 2) NOT NULL )

PARTITION BY RANGE (YEAR(bill_date)) (  // some static partition 
   PARTITION p0 VALUES LESS THAN (2016),
   PARTITION p1 VALUES LESS THAN (2017),
   PARTITION p2 VALUES LESS THAN (2018),
   PARTITION p3 VALUES LESS THAN (2020)
   );



Stored Procedure to create partition:

分隔符 // 创建过程 AddPartitionToTable( IN newPartitionValue DATE)

BEGIN




 -- Create the dynamic SQL statement, using a prepared statement for security
SET @dynamicSQL := CONCAT('ALTER TABLE Sales', ' ADD PARTITION (PARTITION p', DATE_FORMAT(newPartitionValue, '%Y%m%d'), ' VALUES LESS THAN (Year(''', newPartitionValue, ''')))');




PREPARE stmt FROM @dynamicSQL;



 EXECUTE stmt;



DEALLOCATE PREPARE stmt;

END //

分隔符;

© www.soinside.com 2019 - 2024. All rights reserved.