#sql #string #postgresql #unique-constraint #check-constraints
#sql #строка #postgresql #уникальное ограничение #проверка-ограничения
Вопрос:
У меня есть основная таблица для цветовых кодов, в которой хранятся различные уникальные значения цвета. В нем есть столбец Color_value, к которому применено УНИКАЛЬНОЕ ограничение. Однако он принимает как «черные», так и «черные» значения. Как можно справиться с подобными ситуациями?
Комментарии:
1. Я бы указал сопоставление без учета регистра для столбца.
Ответ №1:
Вы можете создать уникальный индекс следующим образом:
create unique index unique_color_value on colors(lower(color_value));
Тем не менее, было бы намного проще сделать ваши данные согласованными с самого начала, используя ограничение, которое позволяет начинать только со строчных значений в столбце.
create table colors (
...
color_value text
unique
check(color_value = lower(color_value))
)
Комментарии:
1. Если я поставлю уникальную проверку во время создания таблицы, не ограничу ли я ввод данных только для значений в нижнем регистре?
2. @Kartikeya: да, это моя точка зрения. Тогда вам больше не нужно будет беспокоиться об этом деле в дальнейшем.
3. Хорошо, но если мне нужно поддерживать чувствительность к регистру, чтобы отображать данные в том виде, в каком они есть в моем приложении, будет ли это работать таким образом?
4. @Kartikeya: в таком случае используйте уникальный индекс, который я предлагаю в начале ответа.
Ответ №2:
Одним из вариантов может быть уникальный индекс, как подробно описано в ответе GMB.
Другие варианты:
- Используйте
citext
расширение (например, чувствительный текст) и используйтеcitext
тип данных. Затем вы можете использовать простое ограничение уникальности. - В PostgreSQL версии 12 или выше создайте сопоставление ICU без учета регистра:
CREATE COLLATION german_ci ( LOCALE = 'de_AT@colStrength=secondary', PROVIDER = 'icu', DETERMINISTIC = FALSE );
Этот пример предназначен для австрийского немецкого языка, используйте язык по вашему выбору или используйте
und
для сопоставления независимо от языка (насколько такая вещь существует).Затем определите столбец как
colname text COLLATE german_ci UNIQUE
, используя обычное ограничение unique.