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

原先可行的建分区表方法:
劣势:必须要把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)

大神们可否帮助解决

阅读 2.6k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题