我有一个分区表,在其中插入存储过程中的数据,
我在表上通过名为year
的列进行了分区,
存储过程能够将数据正确插入分区表中。
但是现在我遇到了一种情况,即可能发生插入,而对于这些插入可能不存在分区,
我需要一种解决方案来查找表是否存在特定的分区名称。
例如。我的表格名称是backups
我现在有3个分区-
2018、2019和2020
但是在存储过程运行的2021年,
今年可能没有分区
因此,我希望我的存储过程在运行时能够处理分区的检查和创建。
以下是我的表结构-
分区创建查询-
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
答案 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
一段时间,直到您记得要进行重组。主动执行此操作对您是有利的,因为重组空分区很快,而重组包含数据的分区将花费更多时间。