@serj37

Как сделать проверку столбца типа varchar на уникальность?

Есть задача:
1. Загнать список слов (фамилии, имена, звания и пр.) в 1 колонку
2. При добавлении списка требуется проверить уникальность значений, если не уникально - не пишем
3. Вытащить список, но уже без дублей обратно в текстовый файл.
С первым и последним справимся (мастер импорта). Вопрос, как обеспечить уникальность значений в колонке при создании БД (структуры)? Желательно не использовать индекс (никакой работы с этой БД не требуется а объём БД сильно вырастает) и не использовать MERGE.
Сейчас имеем вариант с первичным ключом (без проверки на уникальность):
CREATE TABLE dic
( dic_id BIGINT NOT NULL IDENTITY(1, 1), /* Код слова */
dic_value VARCHAR(30) NOT NULL, /* слово */
CONSTRAINT PK_dic PRIMARY KEY (dic_id))
WITH (DATA_COMPRESSION = PAGE);
GO
  • Вопрос задан
  • 892 просмотра
Решения вопроса 1
mindtester
@mindtester
http://iczin.su/hexagram_48
надо отделить мух от котлет

вам надо при загрузке получить уникальность?
или при выгрузке?

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

по вопросу не очень понятно, будет ли работа дальнейшая с базой? если работа не предполагается, а СУБД используется только для фильтрации, то DISTINCT вам в помощь. загружаете все как есть, а выгружаете из базы уже результат запроса SELECT DISTINCT .... можно VIEW создать. это более логичный подход, особенно если разбить данные на колонки - фмилии, имена, отчества, звания, и тд.

ps конкретно по MS SQL и чиувствительности к регистрам, танцы с бубнами не нужны, все придумано до нас (и для нас) https://www.webucator.com/how-to/how-check-case-se...

сам не еще пробовал, врать не буду. но вроде можно изменить для отдельной таблицы базы конечно же, если на сервере крутятся другие приложения, и не желательно изменять их поведение
https://docs.microsoft.com/ru-ru/sql/t-sql/stateme...

на случай многопользовательского сервера, еще резервный вариант - поставить отдельный экземпляр, можно даже LocalDB или Express, и уже в нем задать collation чувствительный к регистру
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@immelnikoff
Изучаю БД
СУБД то какая?
В MySQL, например, просто создается уникальный индекс:
CREATE TABLE dic(
...
dic_value VARCHAR(30) NOT NULL UNIQUE
...);
Ответ написан
@rPman
Такое можно сделать только индексом unique. При добавлении неуникальной записи будет выдавать ошибку.

Иначе вам придется вручную делать то же самое что он, гораздо менее эффективно по скорости и затратам ресурсов.

p.s. если колонок очень много то вместо добавления их в индекс можно добавить только хеш строку на их основе (т.е. заведите в таблице еще одно поле и при добавлении считайте вручную программно или с помощью sql хеш от суммы concatenate ваших колонок, только между строками добавляйте какой-нибудь символ чтобы отделить колонки), только берите что-нибудь не самое простое, чтобы вероятность коллизий была как можно меньше (коллизия в вашем случае это фальшивое срабатывание на строки, которые дубликатами не являются)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы