Mysql 修改分区的自动增量主键

Mysql 修改分区的自动增量主键,mysql,primary-key,partitioning,auto-increment,Mysql,Primary Key,Partitioning,Auto Increment,我需要在时态数据中划分一个MySQL表(字段从下表开始) 当我尝试这样分区时: 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),

我需要在时态数据中划分一个MySQL表(字段从下表开始)

当我尝试这样分区时:

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):主键必须包含表分区函数中的所有列

我从mysql文档中了解到,分区列应该属于主键。 我的问题是,我想将主键更改为复合键,即
PRIMARY KEY('id','fk_id','begin')
,而不更改现有的id列(因为它是应用程序中用于生成可书签URL的字段,所以对id重新编号不是一个选项)


如何更改主键以便进行分区?

我终于找到了一种方法,我的回答是为了其他遇到这个问题的人

//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分钟,然后我必须停止服务以保持数据库的一致性

为什么需要删除自动增量?难道你不能在保持自动递增的同时删除它的主键吗?
//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 
);