Vincolo univoco sulla colonna della tabella
-
03-07-2019 - |
Domanda
Sto avendo una tabella (una tabella esistente con dati al suo interno) e quella tabella ha una colonna UserName. Voglio che questo UserName sia unico. Quindi aggiungo un vincolo come questo:
ALTER TABLE Users
ADD CONSTRAINT [IX_UniqueUserUserName] UNIQUE NONCLUSTERED ([UserName])
Ora continuo a ricevere l'errore che esistono utenti duplicati in questa tabella. Ma ho controllato il database usando la seguente query:
SELECT COUNT(UserId) as NumberOfUsers, UserName
FROM Users
GROUP BY UserName, UserId
ORDER BY UserName
Ciò si traduce in un elenco di utenti che hanno tutti 1 come NumberOfUsers. Quindi nessun duplicato lì. Ma quando controllo lo username non riesce vedo il seguente risultato:
beluga
béluga
In modo così evidente che non riesce a confrontare un " e " e " é " o " è " ... È come se li ignorasse, c'è un modo in cui sql non ignora questi accenti quando aggiunge la chiave unica di contrasto.
SOLUZIONE:
Grazie a voi ragazzi ho trovato la soluzione. Ciò ha risolto il problema:
ALTER TABLE Users
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
Soluzione
Le regole di confronto che stai utilizzando molto probabilmente ignorano il caso e gli accenti durante il confronto. Dovrai cambiare le regole di confronto.
-
Latin1_General_CI_AI
Ignora il caso e gli accenti -
Latin1_General_CI_AS
non ignorerà gli accenti
Elenco dei nomi delle regole di confronto del server SQL qui .
Altri suggerimenti
Anche i tuoi gruppi di query per UserID - non vuoi farlo.
Usa:
SELECT COUNT(*) as NumberOfUsers, UserName
FROM Users
GROUP BY UserName
ORDER BY UserName
La tua query mostrerebbe solo utenti con lo stesso nome e lo stesso ID utente. O, forse, ordina i dati per COUNT (*)
in modo che l'ultima riga visualizzata sia molto probabilmente il piantagrane?
Potresti anche avere problemi con le regole di confronto come altri hanno suggerito, ma normalmente GROUP BY sarebbe autoconsistente.
Presumibilmente UserId è la tua chiave primaria. Poiché fa parte di ciò che stai raggruppando, hai la garanzia di ottenere una singola riga per gruppo. Prendi il " userId " colonna fuori dal tuo gruppo di.
Come dice Andrew Barrett, le regole di confronto predefinite in MySQL non riconoscono correttamente gli accenti.
Cambia le regole di confronto dei tuoi campi in UTF8_unicode_ci
e dovrebbe vedere correttamente gli accenti.
ci significa senza distinzione tra maiuscole e minuscole e puoi utilizzare una diversa fascicolazione se il caso è importante.
Puoi creare una nuova tabella con le nuove regole di confronto, quindi copiare * dalla tabella esistente in quella nuova.
Nota anche che puoi anche creare solo la tabella che ti interessa per le regole di confronto pertinenti (anziché a livello di server). Quindi puoi anche fare qualcosa del tipo:
CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )