MySQL 分区错误

MySQL Partitioning Error

我 运行 MySQL 5.6 table:

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

我正在尝试使用以下命令将 table 分区为 '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
);

我收到以下错误消息:

查询:更改TABLE rawdata PARTITION BY RANGE (RecordingDateTime) (PARTITION p0 VALUES LESS THAN (2013), PARTITION p1 VALUES LESS THAN... 错误代码:1659 字段 'RecordingDateTime' 的类型不允许用于此类分区

非常感谢任何帮助。

我怀疑 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 并使用时间戳范围。

改为

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
);

已找到您每年 12 月需要的代码 here