原先可行的建分区表方法:
劣势:必须要把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)大神们可否帮助解决

解决方案 »

  1.   

    CONVERT(CONCAT(left(unix_timestamp(now()),3), left('9777215210102229301',7)),SIGNED)
    ------ 对于分区来说,这个表达式很明显是一个有问题的东东,当前所处的时间不同,计算的结果就可能不同, 但分区显然是要求一个确定的结果
    不然对于同一个 ID, 今天算出来是处于分区1, 明天算出来应该在分区2,你觉得这个还有意思么?
      

  2.   

    mysql里分区时,是可以对字段进行计算,但是你用now这个函数,显然每天的值都是不一样的,在报错信息里也说了,依赖于时间的这种计算时不能有的。