我的表中有一列类型为bigint(20)
的“时间戳”。但是,插入的值是unix时间戳的乘积,导致附加位数。示例如下:
插入的是 153182595270039 ,实际上是 1531825952 (2018年7月17日)
该表具有以下值作为示例:
uid | car_name | ts
1 | redcar | 153182595270039
我想根据使用范围的上述时间戳进行分区。
但是,由于上述值不是PARTITION BY RANGE
接受的unix时间戳,因此这似乎并不简单。
要解决此问题,我用ts
列创建了一个附加列,后来又在新创建的列的分区上:
1. create a temporary column of "partition_category"
ALTER TABLE car_table ADD partition_category bigint(20);
2. copy the ts into partition_category/100000
UPDATE car_table SET partition_category=ts/100000;
3. Execute the partition
ALTER TABLE car_table PARTITION BY RANGE (partition_category) ( PARTITION p201701 VALUES LESS THAN (UNIX_TIMESTAMP("2018-02-01 00:00:00")), PARTITION p201707 VALUES LESS THAN (UNIX_TIMESTAMP("2018-07-01 00:00:00")));
但是由于 PRIMARY KEY
必须在表的分区功能中包含所有列,因此上述步骤失败了,这意味着我必须在CREATE
步骤上重建表才能考虑新推出的partition_category
如果给定值如上,是否有更好的方法对ts
进行分区?是否可以进行分区而不必更改CREATE
表语句?