如果不存在,如何在MySql中创建分区?

时间:2019-06-26 06:58:39

标签: mysql sql

我有一个分区表,在其中插入存储过程中的数据,
我在表上通过名为year的列进行了分区,
存储过程能够将数据正确插入分区表中。

但是现在我遇到了一种情况,即可能发生插入,而对于这些插入可能不存在分区,
我需要一种解决方案来查找表是否存在特定的分区名称。

例如。我的表格名称是backups
我现在有3个分区-
2018、2019和2020
但是在存储过程运行的2021年,
今年可能没有分区
因此,我希望我的存储过程在运行时能够处理分区的检查和创建。

以下是我的表结构-

enter image description here

分区创建查询-

ALTER TABLE backups
partition by list columns(year)
(partition backup_2018 values IN (2018),
partition backup_2019 values IN (2019),
partition backup_2020 values IN (2020));

以下是我的存储过程-

CREATE DEFINER=`root`@`localhost` PROCEDURE `daily_backup`()
BEGIN
    DECLARE backuptime INT;

    #Need Partition checking and creation here

    SET backuptime = UNIX_TIMESTAMP(CONCAT(DATE_SUB(DATE_FORMAT(NOW(),'%Y-%m-%d'), INTERVAL 1 DAY),' 23:59:59'));

    INSERT into backups 
    (user_id, latest_transaction_id, balance, last_transaction_timestamp, last_transaction_date, snapshot_date, year)    
    SELECT 
    T2.user_id,
    T2.transaction_id AS latest_transaction_id,
    T2.new_balance AS balance,
    T2.created_date AS last_transaction_timestamp,
    DATE_FORMAT(FROM_UNIXTIME(T2.created_date), '%Y-%m-%d %I:%i:%S') AS last_transaction_date,
    DATE_FORMAT(NOW(), '%Y-%m-%d') AS snapshot_date,
    DATE_FORMAT(NOW(), '%Y') AS year
FROM
    (SELECT 
        user_id, MAX(transaction_id) maxTransID
    FROM
        transaction
    WHERE
        created_date < @backuptime
    GROUP BY user_id) Tmp
        JOIN
    transaction T2 ON Tmp.MaxTransID = T2.Transaction_ID;
END

1 个答案:

答案 0 :(得分:0)

我建议使用RANGE COLUMNS而不是LIST COLUMNS进行分区。这样,您可以选择在到目前为止已定义的分区之外的任何年份添加最后一列。

ALTER TABLE backups
partition by range columns(year)
(partition backup_2018 values LESS THAN (2019),
partition backup_2019 values LESS THAN (2020),
partition backup_2020 values LESS THAN (2021),
partition backup_other values LESS THAN MAXVALUE);

随着您临近2020年底,您将使用ALTER TABLE backups REORGANIZE PARTITION backup_other INTO ( ...new partitions... )拆分最后一个分区并为以后的年份创建新分区。

有关更多详细信息,请参见https://dev.mysql.com/doc/refman/5.7/en/partitioning-management-range-list.html

如果您忘记了,也没有造成任何伤害,那么您的数据只会充满backup_other一段时间,直到您记得要进行重组。主动执行此操作对您是有利的,因为重组空分区很快,而重组包含数据的分区将花费更多时间。