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

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



大神们可否帮助解决
...全文
164 3 点赞 打赏 收藏 举报
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
我觉得是否可以新增一个字段,把你计算出来的值放到这个新字段里,然后再分区呢
  • 打赏
  • 举报
回复
mysql里分区时,是可以对字段进行计算,但是你用now这个函数,显然每天的值都是不一样的,在报错信息里也说了,依赖于时间的这种计算时不能有的。
  • 打赏
  • 举报
回复
zjcxc 2017-11-06
CONVERT(CONCAT(left(unix_timestamp(now()),3), left('9777215210102229301',7)),SIGNED) ------ 对于分区来说,这个表达式很明显是一个有问题的东东,当前所处的时间不同,计算的结果就可能不同, 但分区显然是要求一个确定的结果 不然对于同一个 ID, 今天算出来是处于分区1, 明天算出来应该在分区2,你觉得这个还有意思么?
  • 打赏
  • 举报
回复
相关推荐
发帖
MySQL
加入

5.5w+

社区成员

MySQL相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2017-11-04 04:18
社区公告
暂无公告