MySQL | Ошибка - УНИКАЛЬНЫЙ ИНДЕКС должен включать все столбцы в функции разделения таблицы - PullRequest
0 голосов
/ 20 марта 2019

У меня проблема с разделением таблицы в MySQL.Я хочу, чтобы таблица разделов reminders зависела от квартала года, потому что я думаю, что я могу удалить список напоминаний, срок действия которого истек позже.

Может быть, я должен добавить поле в primary key или unique key для работы с разделами,Пожалуйста, помогите мне эту проблему.

CREATE TABLE `reminders`
(
  `id`              bigint(20)          NOT NULL,
  `mer_reminder_id` varchar(255) UNIQUE NOT NULL,
  `created_at`      timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at`      timestamp           NULL     DEFAULT NULL,
  `deleted_at`      timestamp           NULL     DEFAULT NULL,
  `type`            varchar(32)                  DEFAULT NULL,
  `priority`        int(11)                      DEFAULT NULL,
  `due`             timestamp           NULL     DEFAULT NULL,
  `title`           varchar(255)                 DEFAULT NULL,
  `description`     varchar(255)                 DEFAULT NULL,
  `template`        varchar(32)                  DEFAULT NULL,
  `action_id`       bigint(20)          NOT NULL,
  `merchant_id`     bigint(20)          NOT NULL,
  `expired`         bool                NULL     DEFAULT NULL,
  PRIMARY KEY (`id`, `created_at`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  PARTITION BY RANGE ( UNIX_TIMESTAMP(created_at) ) (
    PARTITION zpm_reminder_reminders_q1_2019 VALUES LESS THAN ( UNIX_TIMESTAMP('2019-04-01 00:00:00') ),
    PARTITION zpm_reminder_reminders_q2_2019 VALUES LESS THAN ( UNIX_TIMESTAMP('2019-07-01 00:00:00') ),
    PARTITION zpm_reminder_reminders_q3_2019 VALUES LESS THAN ( UNIX_TIMESTAMP('2019-10-01 00:00:00') ),
    PARTITION zpm_reminder_reminders_q4_2019 VALUES LESS THAN ( UNIX_TIMESTAMP('2020-01-01 00:00:00') ),
    PARTITION zpm_reminder_reminders_q1_2020 VALUES LESS THAN ( UNIX_TIMESTAMP('2020-04-01 00:00:00') ),
    PARTITION zpm_reminder_reminders_q2_2020 VALUES LESS THAN ( UNIX_TIMESTAMP('2020-07-01 00:00:00') ),
    PARTITION zpm_reminder_reminders_q3_2020 VALUES LESS THAN ( UNIX_TIMESTAMP('2020-10-01 00:00:00') ),
    PARTITION zpm_reminder_reminders_q4_2020 VALUES LESS THAN ( UNIX_TIMESTAMP('2021-01-01 00:00:00') )
    );

Проблема: #1503 - A UNIQUE INDEX must include all columns in the table's partitioning function

1 Ответ

0 голосов
/ 20 марта 2019

Сообщение об ошибке довольно очевидно: если ваша таблица разбита на разделы и имеет уникальный ключ, каждый столбец, используемый в уникальном ключе, также должен использоваться как часть раздела.Вы используете UNIX_TIMESTAMP(created_at) для разделения, но у вас есть уникальный ключ на mer_reminder_id, поэтому эта конфигурация недействительна.

Мой совет: не используйте для этого разделы MySQL.Они чрезвычайно ограничены, и часто также глючат.Если вам нужно отбросить старые строки в этой таблице, используйте DELETE с условием - если ваша таблица не имеет размера чрезвычайно , вы потратите гораздо больше времени на обслуживание разделов, чем сэкономите на более быстром удаленииопераций.

(Я не вижу потенциальной проблемы проектирования в вашей таблице - вероятно, первичный ключ в вашей таблице должен быть id, а не (id, created_at). Временные метки почти никогда не принадлежат первичным ключам.)

...