Модификация AUTO_INCREMENT PRIMARY KEY для разделения - PullRequest
3 голосов
/ 19 мая 2011

Мне нужно разделить таблицу MySQL среди временных данных (поле начинается в следующей таблице).

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') без изменения существующих столбцов идентификатора (поскольку это поле используется в приложении для генерации закладок, поэтому перенумерация идентификаторов не является опция)

Как я могу изменить PRIMARY_KEY, чтобы я мог выполнить разбиение?

1 Ответ

8 голосов
/ 22 мая 2011

Я наконец нашел способ сделать это, отвечаю ради других людей, которые сталкивались с этим вопросом

//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 минуты на моем ноутбуке, затем мне придется остановить службу, чтобы сохранить согласованность в моей базе данных

...