获取错误1503:主键必须包括表的分区功能中的所有列

时间:2013-11-28 07:23:08

标签: mysql partition

我有一个像

这样的表结构
CREATE TABLE `cdr` (`id` bigint(20) NOT NULL AUTO_INCREMENT,
                    `dataPacketDownLink` bigint(20) DEFAULT NULL,
                    `dataPacketUpLink` bigint(20) DEFAULT NULL,
                    `dataPlanEndTime` datetime DEFAULT NULL,
                    `dataPlanStartTime` datetime DEFAULT NULL,
                    `dataVolumeDownLink` bigint(20) DEFAULT NULL,
                    `dataVolumeUpLink` bigint(20) DEFAULT NULL,  
                    `dataplan` varchar(255) DEFAULT NULL,  
                    `dataplanType` varchar(255) DEFAULT NULL,  
                    `createdOn` datetime DEFAULT NULL,  
                    `deviceName` varchar(500) DEFAULT NULL,  
                    `duration` int(11) NOT NULL,  
                    `effectiveDuration` int(11) NOT NULL,  
                    `hour` int(11) DEFAULT NULL,  
                    `eventDate` datetime DEFAULT NULL,  
                    `msisdn` bigint(20) DEFAULT NULL,  
                    `quarter` int(11) DEFAULT NULL,  
                    `validDays` int(11) DEFAULT NULL,  
                    `dataLeft` bigint(20) DEFAULT NULL,  
                    `completedOn` datetime DEFAULT NULL,   
                PRIMARY KEY (`id`),   
                KEY `msisdn_index` (`msisdn`),   
                KEY `eventdate_index` (`eventDate`)   
            ) ENGINE=MyISAM AUTO_INCREMENT=55925171 DEFAULT CHARSET=latin1

当我创建分区时 -

ALTER TABLE cdr PARTITION BY RANGE (TO_DAYS(eventdate))  (
    PARTITION p01 VALUES LESS THAN (TO_DAYS('2013-09-01')),  
    PARTITION p02 VALUES LESS THAN (TO_DAYS('2013-09-15')),  
    PARTITION p03 VALUES LESS THAN (TO_DAYS('2013-09-30')),   
    PARTITION p04 VALUES LESS THAN (MAXVALUE));

获得

error 1503: A primary key must include all columns in the table's partitioning function

我到处都读过这个但没有得到任何东西所以请让我知道如何分区这个表。我有2000多万条记录。

谢谢。

2 个答案:

答案 0 :(得分:2)

我已经通过使用主键添加eventdate解决了这个问题。

答案 1 :(得分:0)

可能的解决方案:

  1. 在'ALTER TABLE cdr PARTITION BY RANGE(TO_DAYS(eventdate))'
  2. 上将eventdate更改为eventDate
  3. 将eventDate更改为时间戳。 (mysql不能在datetime上做分区)