MySQL 中如何根据表 ID 中隐藏的时间戳按天进行分区?

发布于 2022-09-06 03:18:11 字数 1231 浏览 24 评论 0

原先可行的建分区表方法:
劣势:必须要把created_at作为主键之一

ALTER TABLE files PARTITION BY RANGE
(UNIX_TIMESTAMP(created_at)) 
(PARTITION {$pname} VALUES LESS THAN ({$less_than_time}))

我现在想按照ID中隐藏的时间戳来做条件

我现在把一部分时间戳放到了ID中,比如现在的ID是9777215210102229301,
其中9777215是时间的一部分,它是1509777215截断前面3位得到的,当我入库的时候,我希望通过拼接当前时间来存入对应分区,于是我尝试如下操作:

selct CONVERT(CONCAT(left(unix_timestamp(now()),3), left('9777215210102229301',7)),SIGNED)

发现 没问题,可以得到正确的时间戳,但我把它替换到分区表构建语句中就报错了
替换语句

ALTER TABLE files PARTITION BY 
RANGE(CONVERT(CONCAT(left(unix_timestamp(now()),3), left(id,7)),SIGNED))
(PARTITION {$pname} VALUES LESS THAN ({$less_than_time}))

报错:

ERROR 1064 (42000): Constant, random or timezone-dependent expressions in (sub)
partitioning function are not allowed near ')
(PARTITION '2017' VALUES LESS THAN (150981119))' at line 1

这样也不行

ALTER TABLE files PARTITION BY 
RANGE(
           UNIX_TIMESTAMP(FROM_UNIXTIME( 
                          CONCAT(left(unix_timestamp(now()),3), left('9777215210102229301',7)))
            )
 ) 
(PARTITION '2017' VALUES LESS THAN 150981119)

大神们可否帮助解决

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文