2011-05-19 118 views
3

我需要在临时数据(字段从下表开始)中对MySQL表进行分区。修改AUTO_INCREMENT PRIMARY KEY进行分区

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 

当我试图划分是这样的:

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列(因为它是一个在应用程序中用来生成可收藏的url的字段,所以重新编号的id不是一个选项)

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

回答

8

我终于找到了一个办法做到这一点,我的回答对谁遇到这个问题,其他人着想

//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分钟,我的笔记本电脑前主键,那么我将不得不停止该服务,以保持我的数据库一致性

+0

为什么你需要删除自动递增?你是否应该在保持自动增量的同时放弃主键? – 2016-01-22 16:30:34