Mysql 修改分区的自动增量主键
我需要在时态数据中划分一个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),
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
);