gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 15:50:52 25 4
gpt4 key购买 nike

我有一个分区表,我正在其中从存储过程插入数据,
我通过名为 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

最佳答案

我建议使用 RANGE 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,直到您记得重新组织为止。主动执行此操作对您有利,因为重新组织空分区很快,而重新组织包含数据的分区则需要更多时间。

关于mysql - 如果MySql中不存在分区,如何创建它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56766950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com