Mysql секционирование каждый месяц - код ошибки: 1503 PRIMARY KEY должен включать все столбцы в функции секционирования таблицы - PullRequest
0 голосов
/ 04 января 2019

Здесь есть похожие случаи, но у меня ничего не получалось.Я создал таблицу:

CREATE TABLE `message` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `message_content` longtext,
  `recipient` varchar(255) DEFAULT NULL,
  `send_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `send_time` (`send_time`, `id`))
 ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

И мне нужно добавить разделение - чтобы создавать новый раздел каждый месяц:

ALTER TABLE messages.message
PARTITION BY RANGE(TO_DAYS(`send_time`))
(PARTITION p01 VALUES LESS THAN (TO_DAYS('2019-01-01')) ENGINE = InnoDB,
PARTITION p02 VALUES LESS THAN (TO_DAYS('2019-02-01')) ENGINE = InnoDB,
PARTITION p03 VALUES LESS THAN (TO_DAYS('2019-03-01')) ENGINE = InnoDB,
PARTITION p04 VALUES LESS THAN (TO_DAYS('2019-04-01')) ENGINE = InnoDB,
PARTITION p05 VALUES LESS THAN (TO_DAYS('2019-05-01')) ENGINE = InnoDB,
PARTITION p06 VALUES LESS THAN (TO_DAYS('2019-06-01')) ENGINE = InnoDB,
PARTITION p07 VALUES LESS THAN (TO_DAYS('2019-07-01')) ENGINE = InnoDB,
PARTITION p08 VALUES LESS THAN (TO_DAYS('2019-08-01')) ENGINE = InnoDB,
PARTITION p09 VALUES LESS THAN (TO_DAYS('2019-09-01')) ENGINE = InnoDB,
PARTITION p10 VALUES LESS THAN (TO_DAYS('2019-10-01')) ENGINE = InnoDB,
PARTITION p11 VALUES LESS THAN (TO_DAYS('2019-11-01')) ENGINE = InnoDB,
PARTITION p12 VALUES LESS THAN (TO_DAYS('2019-12-01')) ENGINE = InnoDB)

Я уже пробовал решения из других ответов (например, добавлениеUNIQUE KEY), но у меня ничего не получалось.Вот что я получаю:

  SQL State  : HY000
  Error Code : 1503
  Message    : A PRIMARY KEY must include all columns in the table's partitioning function

1 Ответ

0 голосов
/ 04 января 2019

Ваш разделительный столбец должен быть частью вашего первичного ключа, недостаточно иметь уникальный индекс UNIQUE.См. mysql docs :

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

Возможно, вы хотите сделать свой уникальный ключ первичным ключом, например:

PRIMARY KEY (`id`, `send_time`)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...