restrição exclusiva em coluna da tabela
-
03-07-2019 - |
Pergunta
Eu estou tendo uma tabela (uma tabela existente com dados nele) e que a tabela tem um nome de usuário coluna. Quero este nome de usuário para ser único. Então eu adicionar uma restrição como esta:
ALTER TABLE Users
ADD CONSTRAINT [IX_UniqueUserUserName] UNIQUE NONCLUSTERED ([UserName])
Agora eu continuo recebendo o erro que existem usuários duplicados na tabela. Mas eu verifiquei o banco de dados usando a seguinte consulta:
SELECT COUNT(UserId) as NumberOfUsers, UserName
FROM Users
GROUP BY UserName, UserId
ORDER BY UserName
Isso resulta em uma lista de todos os usuários que têm 1 como um NumberOfUsers. Portanto, não duplica lá. Mas quando eu estou verificando o nome de usuário que não vejo o seguinte resultado:
beluga
béluga
Assim apperently ele não consegue comparar um "e" e "e" ou "E" ... É como se ele ignora estes, existe alguma maneira que o SQL não ignorar esses acentos ao adicionar o contraint chave única.
SOLUÇÃO:
THX para vocês que eu encontrei a solução. Isso resolveu o problema:
ALTER TABLE Users
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
Solução
O agrupamento que você está usando provavelmente ignora caso e acentos ao comparar. Você precisará alterar o agrupamento.
-
Latin1_General_CI_AI
caso ignora e acentos -
Latin1_General_CI_AS
não vai ignorar acentos
Lista de nomes de agrupamento do SQL Server aqui .
Outras dicas
Seus grupos de consulta por UserID também - você não quer estar fazendo isso
.Use:
SELECT COUNT(*) as NumberOfUsers, UserName
FROM Users
GROUP BY UserName
ORDER BY UserName
A sua consulta só iria aparecer usuários com o mesmo nome e mesma ID do usuário. Ou, talvez, a ordem dos dados por COUNT(*)
assim a última linha que aparece é mais provável que o encrenqueiro?
Você também pode ter problemas com agrupamento como já foi sugerido, mas normalmente, GROUP BY seria auto-consistente.
Presumivelmente UserId é a chave primária. Desde a sua parte do que você está agrupando por, você está garantido para obter uma única linha por grupo. Tome a coluna "userId" fora de seu grupo.
Como Andrew Barrett diz, o agrupamento padrão no MySQL doesn não reconhece acentos corretamente.
Alterar o agrupamento de seus campos para UTF8_unicode_ci
e ele deve ver acentos corretamente.
meios ci maiúsculas e minúsculas, e você pode usar um agrupamento diferente, se caso é importante.
Você pode criar uma nova tabela com o novo agrupamento, em seguida, copiar * da tabela existente para o novo.
Além disso, note que você também pode criar apenas a tabela que você está interessado no agrupamento relevent (em vez de servidor de largura) .Assim você também pode fazer algo como:
CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )