2015-06-29 44 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必須包含表的分區函數中的所有列 –