Как обеспечить соблюдение регистрозависимого уникального индекса только для подмножества данных в MySQL? - PullRequest
0 голосов
/ 22 января 2019

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

Большинство уникальныхИдентификаторы в наборе данных не чувствительны к регистру, поэтому создание чувствительного к регистру всего столбца не является идеальным.Я также могу определить, какие строки имеют идентификаторы, чувствительные к регистру.

Похоже, что MySQL также не может создать индекс с условием (исправьте меня, если я ошибаюсь).

Вот моя схема

masterId - int
canonicalId - varchar
environment - int

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

Какой хороший способ справиться с этим?

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

Я думал о создании хэша SHA-256 canonicalId для этой конкретной среды и фактических данных вместе ссвязанный хеш будет сохранен в отдельной таблице, если это потребуется для последующего поиска.Мне нужно только обеспечить уникальность в этой таблице, так как информация в столбце masterId используется везде в моем приложении.Не уверен, что так будет лучше.

1 Ответ

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

Используя Сгенерированное выражение , вы можете создать:

alter table t
add g varchar(20) charset utf8 COLLATE utf8_bin GENERATED ALWAYS AS (
   IF(environmentId=7, canonicalId, UPPER(canonicalId))
)

Примечание: MariaDB не поддерживает явное сопоставление сгенерированных столбцов ( MDEV-12161 ).

Параметры сортировки для g с использованием явного или табличного значения по умолчанию должны быть чувствительны к регистру.

Затем сделать environmentId, g уникальным:

alter table t add unique index gunique(environmentId, g)

https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=bba30d04eb21cc60a1c1f8993e5be6e6

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