I want to partition my data by "MONTH"
我想按“MONTH”对数据进行分区
I am trying this,
我在试试这个,
ALTER TABLE t1 PARTITION BY RANGE(TO_DAYS(FROM_UNIXTIME(transaction_date)))(
PARTITION JAN VALUES LESS THAN (TO_DAYS('2013-02-01')),
PARTITION FEB VALUES LESS THAN (TO_DAYS('2013-03-01')),
PARTITION MAR VALUES LESS THAN (TO_DAYS('2013-04-01')),
PARTITION APR VALUES LESS THAN (TO_DAYS('2013-05-01')),
PARTITION MAY VALUES LESS THAN (TO_DAYS('2013-06-01')),
PARTITION JUN VALUES LESS THAN (TO_DAYS('2013-07-01')),
PARTITION JUL VALUES LESS THAN (TO_DAYS('2013-08-01')),
PARTITION AUG VALUES LESS THAN (TO_DAYS('2013-09-01')),
PARTITION SEP VALUES LESS THAN (TO_DAYS('2013-10-01')),
PARTITION `OCT` VALUES LESS THAN (TO_DAYS('2013-11-01')),
PARTITION NOV VALUES LESS THAN (TO_DAYS('2013-12-01')),
PARTITION `DEC` VALUES LESS THAN (TO_DAYS('2014-01-01'))
);
);
transaction_date INT NOT NULL //store date by UNIX_TIMESTAMP()
Error Code: 1564 This partition function is not allowed
错误代码:1564不允许使用此分区功能
How do I create a partition for every month of the current year?
如何为当年的每个月创建一个分区?
1 个解决方案
#1
4
This could be a bug or limitation.
这可能是一个错误或限制。
For Monthly partitioning you may try this:
对于每月分区,您可以尝试这样做:
SQLFiddle演示
ALTER TABLE t1 PARTITION BY RANGE(transaction_date)(
PARTITION JAN VALUES LESS THAN (UNIX_TIMESTAMP('2013-02-01')),
PARTITION FEB VALUES LESS THAN (UNIX_TIMESTAMP('2013-03-01')),
PARTITION MAR VALUES LESS THAN (UNIX_TIMESTAMP('2013-04-01')),
PARTITION APR VALUES LESS THAN (UNIX_TIMESTAMP('2013-05-01')),
PARTITION MAY VALUES LESS THAN (UNIX_TIMESTAMP('2013-06-01')),
PARTITION JUN VALUES LESS THAN (UNIX_TIMESTAMP('2013-07-01')),
PARTITION JUL VALUES LESS THAN (UNIX_TIMESTAMP('2013-08-01')),
PARTITION AUG VALUES LESS THAN (UNIX_TIMESTAMP('2013-09-01')),
PARTITION SEP VALUES LESS THAN (UNIX_TIMESTAMP('2013-10-01')),
PARTITION `OCT` VALUES LESS THAN (UNIX_TIMESTAMP('2013-11-01')),
PARTITION NOV VALUES LESS THAN (UNIX_TIMESTAMP('2013-12-01')),
PARTITION `DEC` VALUES LESS THAN (UNIX_TIMESTAMP('2014-01-01'))
);
If you have a column having DATE as data type then you may try this for Daily partitioning inside monthly paritioning: Try using sub-partitioning in MySQL
如果您有一个以DATE作为数据类型的列,那么您可以尝试使用每月分区内的每日分区:尝试在MySQL中使用子分区
SQLFiddle演示
ALTER TABLE t1
PARTITION BY RANGE( MONTH(FROM_UNIXTIME(transaction_date) )
SUBPARTITION BY HASH( DAY(FROM_UNIXTIME(transaction_date)) )
SUBPARTITIONS 31 (
PARTITION p0 VALUES LESS THAN (2),
PARTITION p1 VALUES LESS THAN (3),
PARTITION p2 VALUES LESS THAN (4),
PARTITION p3 VALUES LESS THAN (5),
PARTITION p4 VALUES LESS THAN (6),
PARTITION p5 VALUES LESS THAN (7),
PARTITION p6 VALUES LESS THAN (8),
PARTITION p7 VALUES LESS THAN (9),
PARTITION p8 VALUES LESS THAN (10),
PARTITION p9 VALUES LESS THAN (11),
PARTITION p10 VALUES LESS THAN (12),
PARTITION p11 VALUES LESS THAN MAXVALUE
);
#1
4
This could be a bug or limitation.
这可能是一个错误或限制。
For Monthly partitioning you may try this:
对于每月分区,您可以尝试这样做:
SQLFiddle演示
ALTER TABLE t1 PARTITION BY RANGE(transaction_date)(
PARTITION JAN VALUES LESS THAN (UNIX_TIMESTAMP('2013-02-01')),
PARTITION FEB VALUES LESS THAN (UNIX_TIMESTAMP('2013-03-01')),
PARTITION MAR VALUES LESS THAN (UNIX_TIMESTAMP('2013-04-01')),
PARTITION APR VALUES LESS THAN (UNIX_TIMESTAMP('2013-05-01')),
PARTITION MAY VALUES LESS THAN (UNIX_TIMESTAMP('2013-06-01')),
PARTITION JUN VALUES LESS THAN (UNIX_TIMESTAMP('2013-07-01')),
PARTITION JUL VALUES LESS THAN (UNIX_TIMESTAMP('2013-08-01')),
PARTITION AUG VALUES LESS THAN (UNIX_TIMESTAMP('2013-09-01')),
PARTITION SEP VALUES LESS THAN (UNIX_TIMESTAMP('2013-10-01')),
PARTITION `OCT` VALUES LESS THAN (UNIX_TIMESTAMP('2013-11-01')),
PARTITION NOV VALUES LESS THAN (UNIX_TIMESTAMP('2013-12-01')),
PARTITION `DEC` VALUES LESS THAN (UNIX_TIMESTAMP('2014-01-01'))
);
If you have a column having DATE as data type then you may try this for Daily partitioning inside monthly paritioning: Try using sub-partitioning in MySQL
如果您有一个以DATE作为数据类型的列,那么您可以尝试使用每月分区内的每日分区:尝试在MySQL中使用子分区
SQLFiddle演示
ALTER TABLE t1
PARTITION BY RANGE( MONTH(FROM_UNIXTIME(transaction_date) )
SUBPARTITION BY HASH( DAY(FROM_UNIXTIME(transaction_date)) )
SUBPARTITIONS 31 (
PARTITION p0 VALUES LESS THAN (2),
PARTITION p1 VALUES LESS THAN (3),
PARTITION p2 VALUES LESS THAN (4),
PARTITION p3 VALUES LESS THAN (5),
PARTITION p4 VALUES LESS THAN (6),
PARTITION p5 VALUES LESS THAN (7),
PARTITION p6 VALUES LESS THAN (8),
PARTITION p7 VALUES LESS THAN (9),
PARTITION p8 VALUES LESS THAN (10),
PARTITION p9 VALUES LESS THAN (11),
PARTITION p10 VALUES LESS THAN (12),
PARTITION p11 VALUES LESS THAN MAXVALUE
);