首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改分区的AUTO_INCREMENT主键

问修改分区的AUTO_INCREMENT主键
EN

Stack Overflow用户
提问于 2011-05-20 00:17:15
回答 1查看 7.3K关注 0票数 3

我需要在时态数据中对MySQL表进行分区(下表中的字段开始)。

代码语言:javascript
复制
CREATE TABLE `table1` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT, 
  `fk_id` bigint(20) NOT NULL,  
  `begin` bigint(20) NOT NULL,     
  PRIMARY KEY (`id`),
  KEY `FK1E57078DB20EC268` (`fk_id`)
) ENGINE=MyISAM AUTO_INCREMENT=10443288 DEFAULT CHARSET=latin1

当我尝试像这样进行分区时:

代码语言:javascript
复制
alter table table1 partition by range (begin) (
PARTITION until_2010_07 VALUES LESS THAN (1280620800000),
PARTITION 2010_08 VALUES LESS THAN (1283299200000),
PARTITION 2010_09 VALUES LESS THAN (1285891200000),
PARTITION 2010_10 VALUES LESS THAN (1288569600000),
PARTITION 2010_11 VALUES LESS THAN (1291161600000),
PARTITION 2010_12 VALUES LESS THAN (1293840000000),
PARTITION from_2011 VALUES LESS THAN MAXVALUE
);

我得到一个MySQL错误:ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function

根据我在mysql文档中的理解,分区列应该属于主键。对我来说,问题是我想要将PRIMARY_KEY更改为复合的PRIMARY KEY ('id','fk_id','begin'),即不更改现有的id列(因为它是应用程序中用于生成可加书签的urls的字段,所以不能对id重新编号)。

如何更改PRIMARY_KEY以便可以进行分区?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-22 14:12:08

我终于找到了解决这个问题的方法,我回答这个问题是为了帮助其他遇到这个问题的人。

代码语言:javascript
复制
//drop auto_increment capability
alter table table1 change column id id BIGINT NOT NULL;
//in one line, drop primary key and rebuild one
alter table table1 drop primary key, add primary key(id,fk_id,begin);
//re add the auto_increment capability, last value is remembered
alter table table1 change column id id BIGINT NOT NULL AUTO_INCREMENT;
//build the partition
alter table table1 partition by range (begin) ( 
    PARTITION until_2010_07 VALUES LESS THAN (1280620800000), 
    PARTITION 2010_08 VALUES LESS THAN (1283299200000), 
    PARTITION 2010_09 VALUES LESS THAN (1285891200000), 
    PARTITION 2010_10 VALUES LESS THAN (1288569600000), 
    PARTITION 2010_11 VALUES LESS THAN (1291161600000), 
    PARTITION 2010_12 VALUES LESS THAN (1293840000000), 
    PARTITION from_2011 VALUES LESS THAN MAXVALUE 
);

分区确实很简单,但我建议人们在实际使用数据库之前,在创建主键时考虑一下:-)

在我的笔记本电脑上,每个步骤都需要3分钟,然后我将不得不停止服务以保持数据库中的一致性

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6061662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档