MySQL уникальный индекс по нескольким полям - PullRequest
1 голос
/ 18 января 2011

В нашей БД есть специальный вид таблицы, в которой хранится история ее изменений.Так называемая «самоархивируемая» таблица:

CREAT TABLE coverages (
   id INT, # primary key, auto-increment
   subscriber_id INT,
   current CHAR,  # - could be "C" or "H".
   record_version INT,
   # etc.
);

В ней хранятся «покрытия» наших подписчиков.Поле «текущий» указывает, является ли это текущей / исходной записью («C») или исторической записью («H»).

Мы могли бы иметь только одно текущее покрытие «C» для данного подписчика, но мыне может создать уникальный индекс с 2 полями (* subscriber_id и current *), потому что для любой данной записи "C" может быть любое количество записей "H" - история изменений.

Таким образом, индекс долженбыть уникальным только для current == 'C' и любого subscriber_id.

Это можно сделать в Oracle DB с помощью чего-то вроде «материализованных представлений»: где мы можем создать материализованное представление, которое будетвключать только записи с current = 'C' и создать уникальный индекс с этими 2 полями: * subscriber_id, current *.

Вопрос: как это можно сделать вMySQL?

1 Ответ

2 голосов
/ 18 января 2011

Вы можете сделать это, используя NULL значения.Если вы используете NULL вместо "H", MySQL будет игнорировать строку при оценке ограничения UNIQUE :

A UNIQUE index creates a constraint such that all values in the index must be
distinct. An error occurs if you try to add a new row with a key value that
matches an existing row. This constraint does not apply to NULL values except
for the BDB storage engine. For other engines, a UNIQUE index permits multiple
NULL values for columns that can contain NULL.

Теперь это немного обманывает,и это означает, что вы не можете иметь свои данные именно так, как вы хотите.Так что это решение может не соответствовать вашим потребностям.Но если вы сможете переработать ваши данные таким образом, это должно сработать.

...