Изменение ПЕРВИЧНОГО КЛЮЧА AUTO_INCREMENT для разделения

#mysql #primary-key #partitioning #auto-increment

#mysql #первичный ключ #разделение #автоматическое увеличение

Вопрос:

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

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

Ответ №1:

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

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

Комментарии:

1. Почему вам нужно было отказаться от автоматического увеличения? Разве вы не должны иметь возможность удалить его первичный ключ, сохраняя при этом автоматическое увеличение?

2. Поскольку этот ответ все еще появляется при поиске: я полагаю, что OP отбросил автоматическое увеличение перед изменением первичного ключа, потому что для автоматического увеличения требуется индекс в столбце. Возможно, удастся избежать удаления автоматического увеличения, вручную создав дополнительный индекс для id перед изменением первичного ключа.