Restricción única en la columna de la tabla
-
03-07-2019 - |
Pregunta
Tengo una tabla (una tabla existente con datos en ella) y esa tabla tiene una columna UserName. Quiero que este Nombre de usuario sea único. Así que agrego una restricción como esta:
ALTER TABLE Users
ADD CONSTRAINT [IX_UniqueUserUserName] UNIQUE NONCLUSTERED ([UserName])
Ahora sigo recibiendo el error de que existen usuarios duplicados en esta tabla. Pero he revisado la base de datos utilizando la siguiente consulta:
SELECT COUNT(UserId) as NumberOfUsers, UserName
FROM Users
GROUP BY UserName, UserId
ORDER BY UserName
Esto da como resultado una lista de usuarios que tienen 1 como NumberOfUsers. Así que no hay duplicados allí. Pero cuando verifico el nombre de usuario que falla, veo el siguiente resultado:
beluga
béluga
Aparentemente, no puede comparar una " e " y " é " o " è " ... Es como si los ignorara, ¿hay alguna manera de que sql no ignore estos acentos cuando agrega la clave única?
SOLUCIÓN:
THX para ustedes, he encontrado la solución. Esto solucionó el problema:
ALTER TABLE Users
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
Solución
La intercalación que está utilizando probablemente ignora el caso y los acentos cuando se compara. Tendrás que cambiar la colación.
-
Latin1_General_CI_AI
Ignora el caso y los acentos -
Latin1_General_CI_AS
no ignorará los acentos
Lista de nombres de colación de servidores SQL aquí .
Otros consejos
Sus consultas también se agrupan por ID de usuario, no desea hacerlo.
Uso:
SELECT COUNT(*) as NumberOfUsers, UserName
FROM Users
GROUP BY UserName
ORDER BY UserName
Su consulta solo mostrará usuarios con el mismo nombre y la misma ID de usuario. O, tal vez, ordene los datos por COUNT (*)
de modo que la última fila que aparece sea probablemente la que causa problemas.
También podría tener problemas con la recopilación, como han sugerido otros, pero normalmente, GROUP BY sería coherente.
Presumiblemente UserId es su clave principal. Ya que es parte de lo que está agrupando, tiene la garantía de obtener una sola fila por grupo. Toma el " userId " columna fuera de su grupo por.
Como dice Andrew Barrett, la intercalación predeterminada en MySQL no reconoce los acentos correctamente.
Cambie la intercalación de sus campos a UTF8_unicode_ci
y debería ver los acentos correctamente.
ci significa que no distingue entre mayúsculas y minúsculas, y puede usar una intercalación diferente si el caso es importante.
Puede crear una nueva tabla con la nueva intercalación, luego copiar * desde la tabla existente a la nueva.
También tenga en cuenta que también puede crear solo la tabla que le interesa en la intercalación relevante (en lugar de en todo el servidor). También puede hacer algo como:
CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )