【问题标题】:getting error 1503: A primary key must include all columns in the table's partitioning function出现错误 1503:主键必须包含表分区函数中的所有列
【发布时间】:2013-12-14 03:10:27
【问题描述】:

我有一个类似的表结构-

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

我到处都读过这方面的信息,但没有得到任何信息,所以请告诉我如何对这个表进行分区。我有 20+ 百万条记录。

谢谢。

【问题讨论】:

标签: mysql partition


【解决方案1】:

可能的解决方案:

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

【讨论】:

  • 呃,MySQL 什么时候不能在 DATETIME 进行分区了?根据他们的文档:“按 RANGE 对表进行分区,对于分区表达式,使用对 DATE、TIME 或 DATETIME 列进行操作并返回整数值的函数”dev.mysql.com/doc/refman/5.5/en/partitioning-range.html
【解决方案2】:

我已经通过添加带有主键的 eventdate 解决了这个问题。

【讨论】:

  • 这是什么意思?您是否将eventdate 作为您的主键?如果两个事件发生在同一日期怎么办? SQL 在哪里?
猜你喜欢
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多