Mysql - как сохранить уникальные ограничения при разделении по RANGE (timestamp)? - PullRequest
0 голосов
/ 03 июля 2019

У меня есть одна таблица, которую я хочу разделить по RANGE (метка времени созданного_дата), поэтому я могу легко удалить старые данные (путем удаления раздела).

CREATE TABLE `orders` (
  `order_id` NVARCHAR(64) NOT NULL,
  `amount` INTEGER NOT NULL,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `modified_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  KEY `order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE dropship.orders
PARTITION BY RANGE (UNIX_TIMESTAMP(created_at)) (
    PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2019-03-01 00:00:00') ),
    PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2019-04-01 00:00:00') ),
    PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2019-05-01 00:00:00') ),
    PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2019-06-01 00:00:00') ),
    PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2019-07-01 00:00:00') ),
    PARTITION p5 VALUES LESS THAN (MAXVALUE)
);

Эта таблица имеет только два использования: получить по order_id или обновить по order_id.

select * from orders where order_id = '123';
update orders set amount = 10 where order_id = '123';

Из-за ограничений секционирования Mysql я не могу добавить уникальный ключ для order_id, так как для секционирования буду использовать поле create_at.

All columns used in the table's partitioning expression must be part of every unique key that the table may have, including any primary key.

Вопрос:

Есть ли способ сделать order_id уникальным в этой таблице, пожалуйста?

Я думал о разбиении по order_id, но сложно удалить старые данные таким образом.

Любое предложение приветствуется. (Например, может быть, у вас есть лучший дизайн для этой таблицы).

1 Ответ

2 голосов
/ 03 июля 2019
BEGIN;
SELECT 1 FROM orders WHERE order_id = 234  FOR UPDATE;
if row exists, you have a dup error.
INSERT INTO orders ... order_id = 234;
COMMIT;

Но, как указывает Рэймонд, вы также можете сбросить PARTITIONing и сделать столбец PRIMARY KEY. Это сделает все указанные операции несколько быстрее.

...