Уникальное ограничение на столбец таблицы - PullRequest
1 голос
/ 04 марта 2009

У меня есть таблица (существующая таблица с данными в ней), и в этой таблице есть столбец UserName. Я хочу, чтобы это имя пользователя было уникальным. Поэтому я добавляю ограничение вот так:

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

Ответы [ 5 ]

7 голосов
/ 04 марта 2009

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

  • Latin1_General_CI_AI Игнорирует регистр и акценты
  • Latin1_General_CI_AS не будет игнорировать акценты

Список имен сопоставления SQL-сервера здесь .

5 голосов
/ 04 марта 2009

Ваши группы запросов также по идентификатору пользователя - вы не хотите этого делать.

Использование:

SELECT COUNT(*) as NumberOfUsers, UserName 
    FROM Users 
    GROUP BY UserName 
    ORDER BY UserName

Ваш запрос будет отображать только пользователей с одинаковыми именами и идентификаторами. Или, может быть, упорядочить данные по COUNT(*), так что последняя строка, которая появляется, скорее всего, нарушитель?

У вас также могут быть проблемы с сопоставлением, как предлагали другие, но обычно GROUP BY будет самосогласованным.

2 голосов
/ 04 марта 2009

Предположительно, UserId - ваш первичный ключ. Так как это часть того, что вы группируете, вы гарантированно получите по одной строке на группу. Удалите столбец "userId" из своей группы.

1 голос
/ 04 марта 2009

Как говорит Эндрю Барретт, сопоставление по умолчанию в MySQL не распознает акценты правильно.

Измените параметры сортировки ваших полей на UTF8_unicode_ci, и они должны правильно видеть акценты.

ci означает, что регистр не учитывается, и вы можете использовать другое сопоставление, если регистр важен.

Вы можете создать новую таблицу с новым сопоставлением, а затем скопировать * из существующей таблицы в новую.

0 голосов
/ 04 марта 2009

Также обратите внимание, что вы также можете создать только таблицу, которая вас интересует в соответствующем сопоставлении (вместо всей серверной). Так что вы также можете сделать что-то вроде:

CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...