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。
我 运行 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。