Как добавить уникальный индекс для поля в многораздельной БД MySQL? - PullRequest
5 голосов
/ 04 февраля 2011

У меня есть таблица, foo, которая разделена на «create_at» и имеет первичный ключ как (id, created_at).Т.е.:

CREATE TABLE `foo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `bar_id` int(11) DEFAULT NULL,
   ...

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (TO_DAYS(created_at))
(PARTITION p0 VALUES LESS THAN (733712) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (733773) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (733832) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN (733893) ENGINE = InnoDB,
...
)

Как мне создать уникальный индекс, такой, чтобы bar_id был уникальным для всех разделов?Если я пытаюсь что-то вроде:

CREATE UNIQUE INDEX some_index USING BTREE ON foo (bar_id);

, я получаю сообщение об ошибке:

ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function

Но если я включаю функцию разделения (id, created_at) при построении индексазатем я получаю индекс, который не гарантирует уникальность bar_id.

ОБНОВЛЕНИЕ

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

PRIMARY KEY (`id`,`created_at`)

Кроме того, bar_id может быть NULL.

Ответы [ 3 ]

2 голосов
/ 13 февраля 2012

Сообщение об ошибке само объясняет проблему.Пожалуйста, прочитайте руководство, http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-partitioning-keys-unique-keys.html

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

0 голосов
/ 04 февраля 2011

Это можно сделать через дополнительную таблицу для хранения уникального bar_id и триггера перед вставкой.

0 голосов
/ 04 февраля 2011

Создать первичный ключ.

Из документов MySQL о разбиении: любой столбец, используемый для выражения разделения, должен быть частью первичного ключа таблицы (если он есть) или (первого) уникального ключа (если он имеет уникальный ключ но нет первичного ключа). В противном случае вы увидите сообщение об ошибке: «ПЕРВИЧНЫЙ КЛЮЧ должен включить все поля в функцию разделения».

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

...