Уникальное ограничение для столбца таблицы
-
03-07-2019 - |
Вопрос
У меня есть таблица (существующая таблица с данными в ней), и в этой таблице есть столбец Имя пользователя.Я хочу, чтобы это имя пользователя было уникальным.Поэтому я добавляю такое ограничение:
ALTER TABLE Users
ADD CONSTRAINT [IX_UniqueUserUserName] UNIQUE NONCLUSTERED ([UserName])
Теперь я продолжаю получать сообщение об ошибке о том, что в этой таблице существуют повторяющиеся пользователи.Но я проверил базу данных, используя следующий запрос:
SELECT COUNT(UserId) as NumberOfUsers, UserName
FROM Users
GROUP BY UserName, UserId
ORDER BY UserName
В результате в списке пользователей будет 1 в качестве NumberOfUsers.Так что дубликатов здесь нет.Но когда я проверяю имя пользователя, он терпит неудачу, я вижу следующий результат:
beluga
béluga
Так что, очевидно, он не может сравнить «е» и «é» или «è»…Как будто он их игнорирует, есть ли способ, которым sql не игнорирует эти акценты при добавлении ограничения уникального ключа.
РЕШЕНИЕ:
Спасибо вам, ребята, я нашел решение.Это решило проблему:
ALTER TABLE Users
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
Решение
Используемая вами сортировка, скорее всего, игнорирует регистр и акценты при сравнении.Вам нужно будет изменить сортировку.
Latin1_General_CI_AI
Игнорирует регистр и акцентыLatin1_General_CI_AS
не будет игнорировать акценты
Список имен параметров сортировки SQL-сервера здесь.
Другие советы
Ваши запросы также группируются по UserID — вы не хотите этого делать.
Использовать:
SELECT COUNT(*) as NumberOfUsers, UserName
FROM Users
GROUP BY UserName
ORDER BY UserName
Ваш запрос будет отображать только пользователей с тем же именем и тем же идентификатором пользователя.Или, может быть, упорядочить данные по COUNT(*)
так что последняя строка, которая появляется, скорее всего, является нарушителем спокойствия?
У вас также могут возникнуть проблемы с сопоставлением, как предлагали другие, но обычно GROUP BY будет самосогласованным.
Предположительно UserId является вашим первичным ключом.Поскольку это часть того, по чему вы группируете, вы гарантированно получите одну строку на группу.Удалите столбец «userId» из своей группы.
Как говорит Эндрю Барретт, параметры сортировки по умолчанию в MySQL неправильно распознают акценты.
Измените параметры сортировки полей на UTF8_unicode_ci
и он должен правильно видеть акценты.
ci означает нечувствительность к регистру, и вы можете использовать другие параметры сортировки, если регистр важен.
Вы можете создать новую таблицу с новыми параметрами сортировки, а затем скопировать * из существующей таблицы в новую.
Также обратите внимание, что вы также можете создать только интересующую вас таблицу с соответствующей сортировкой (вместо всего сервера). Таким образом, вы также можете сделать что-то вроде:
CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )