2015-06-29 45 views
0

我运行MySQL 5.6,并具有如下表:MySQL分区错误

CREATE TABLE `rawdata` (
    `RawDataSeq` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `SpeciesSeq` int(10) unsigned DEFAULT NULL, 
    `DataSourceSeq` int(10) unsigned DEFAULT NULL, 
    `MeasurementSeq` int(10) unsigned DEFAULT NULL, 
    `RecordingDateTime` datetime DEFAULT NULL, 
    `RawSensorData` varchar(100) DEFAULT NULL, 
    `RawDataNumeric` decimal(36,18) DEFAULT NULL, 
    `RawDataString` varchar(100) DEFAULT NULL, 
    `RawDataDate` datetime DEFAULT NULL, 
    `RawDataTime` varchar(45) DEFAULT NULL, 
    `RawDataDateTime` datetime DEFAULT NULL, 
    `ActiveRecord` int(10) unsigned DEFAULT NULL, 
    `LastUpdateDate` datetime DEFAULT NULL, 
    `UserId` varchar(6) DEFAULT NULL, 
    `BadData` varchar(200) DEFAULT NULL, 
    PRIMARY KEY (`RawDataSeq`) 
) ENGINE=MyISAM AUTO_INCREMENT=5676258 DEFAULT CHARSET=latin1 

我试图通过“RecordingDateTime”使用下面的命令分区表:

ALTER TABLE rawdata PARTITION BY RANGE (RecordingDateTime) (
    PARTITION p0 VALUES LESS THAN (2013), 
    PARTITION p1 VALUES LESS THAN (2014), 
    PARTITION p2 VALUES LESS THAN (2015), 
    PARTITION p3 VALUES LESS THAN (UNIX_TIMESTAMP('2015-06-01 00:00:00')), 
    PARTITION p4 VALUES LESS THAN MAXVALUE 
); 

我收到以下错误消息:

查询:ALTER TABLE rawdata PARTITION BY RANGE(RecordingDateTime)(PARTITION p0值小于(2013),PARTITION p1的值小于... 错误代码:1659 字段'RecordingDateTime'是这种类型的分区不允许的类型

任何帮助,非常感谢。

回答

1

更改为

PRIMARY KEY (`RawDataSeq`, RecordingDateTime) 

ALTER TABLE rawdata PARTITION BY RANGE (TO_DAYS(RecordingDateTime)) (
    PARTITION p_old VALUES LESS THAN (TO_DAYS('2013-01-01')), 
    PARTITION p2013 VALUES LESS THAN (TO_DAYS('2014-01-01')), 
    PARTITION p2014 VALUES LESS THAN (TO_DAYS('2015-01-01')), 
    PARTITION p2015 VALUES LESS THAN (TO_DAYS('2016-01-01')), 
    PARTITION future VALUES LESS THAN MAXVALUE 
); 

你需要每年十二月的代码被发现here

+0

这很棒,并且可以无缝工作。谢谢!!我还检查了有关分区维护的文章,并在12月份,我是否可以简单地删除所有分区并在2016年添加一个分区? –

+0

注意:“DROP PARTITION”会丢失分区中的任何数据。 'REORGANIZE PARTITION'可用于组合(或拆分)分区。少于10个分区几乎没有任何用处。有超过50个分区可能会出现性能问题。 –

0

我怀疑datetime值和您使用的整数值有问题。一种方法是:

ALTER TABLE rawdata PARTITION BY RANGE (year(RecordingDateTime)) (
    PARTITION p0 VALUES LESS THAN (2013), 
    PARTITION p1 VALUES LESS THAN (2014), 
    PARTITION p2 VALUES LESS THAN (2015), 
    PARTITION p3 VALUES LESS THAN MAXVALUE 
); 

如果不将RecordingDateTime存储为一个时间戳,你也可以尝试:

ALTER TABLE rawdata PARTITION BY RANGE (year(RecordingDateTime)*100 + month(RecordDateTime) (
    PARTITION p0 VALUES LESS THAN (201300), 
    PARTITION p1 VALUES LESS THAN (201400), 
    PARTITION p2 VALUES LESS THAN (201500), 
    PARTITION p3 VALUES LESS THAN (201506), 
    PARTITION p4 VALUES LESS THAN MAXVALUE 
); 

否则,该值存储为timestamp,并使用时间戳范围。

+0

感谢您的帮助。我尝试了第二个选项,因为我没有将这些值存储为时间戳。我现在收到错误消息:错误代码:1503 PRIMARY KEY必须包含表的分区函数中的所有列 –