Unique-Einschränkung auf Tabellenspalte
-
03-07-2019 - |
Frage
Ich habe eine Tabelle (eine vorhandene Tabelle mit Daten in it) und die Tabelle hat eine Spalte Usernamen. Ich möchte diese Username eindeutig sein. So füge ich eine Einschränkung wie folgt aus:
ALTER TABLE Users
ADD CONSTRAINT [IX_UniqueUserUserName] UNIQUE NONCLUSTERED ([UserName])
Jetzt erhalte ich die Fehlermeldung, die Benutzer duplizieren in dieser Tabelle existieren. Aber ich habe die Datenbank mit der folgenden Abfrage geprüft:
SELECT COUNT(UserId) as NumberOfUsers, UserName
FROM Users
GROUP BY UserName, UserId
ORDER BY UserName
Dies führt zu einer Liste der Benutzer alle 1 als NumberOfUsers hat. So gibt es keine Duplikate. Aber wenn ich die Benutzername bin Überprüfung er nicht ich sehe folgendes Ergebnis:
beluga
béluga
So apperently er nicht ein „e“ und „E“ oder „e“ vergleichen ... Es ist wie er diese ignoriert, ist es eine Möglichkeit, dass SQL nicht, diese Akzente nicht ignorieren, wenn die eindeutigen Schlüssel contraint hinzufügen.
LÖSUNG:
THX an euch ich die Lösung gefunden habe. Dies das Problem behoben:
ALTER TABLE Users
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
Lösung
Die Sortierung Sie wahrscheinlich verwenden ignoriert Fall und Akzente beim Vergleich. Sie werden die Sortierung ändern.
-
Latin1_General_CI_AI
Ignoriert Fall und Akzente -
Latin1_General_CI_AS
nicht ignorieren Akzente
Liste der SQL Server-Sortierungsnamen hier .
Andere Tipps
Ihre Anfrage Gruppen von Benutzer-ID zu -. Sie wollen nicht, dass zu tun,
Verwendung:
SELECT COUNT(*) as NumberOfUsers, UserName
FROM Users
GROUP BY UserName
ORDER BY UserName
Ihre Abfrage würde zeigen, nur von Benutzern mit dem gleichen Namen und die gleichen Benutzer-ID. Oder vielleicht, um die Daten von COUNT(*)
zu bestellen, so dass die letzte Zeile, die am meisten auftaucht ist wahrscheinlich der Querulant?
Sie können auch Probleme mit Sortierungs haben wie andere vorgeschlagen haben, aber normalerweise würde GROUP BY selbst konsistent.
Vermutlich UserId ist Ihr Primärschlüssel. Da es ein Teil ist, was Sie Gruppierung durch, werden Sie garantiert eine einzelne Zeile pro Gruppe zu erhalten. Nehmen Sie die „userId“ Spalte aus Ihrer Gruppe durch.
Wie Andrew Barrett sagt, die Standardsortierung in MySQL doesn nicht Akzente erkennen korrekt.
Ändern Sie die Sortierung Ihrer Felder auf UTF8_unicode_ci
und es sollte Akzente richtig sehen.
ci bedeutet Groß- und Kleinschreibung, und Sie können eine andere Sortierung verwenden, wenn Fall wichtig ist.
Sie können eine neue Tabelle mit der neuen Zusammenstellung erstellen, kopieren Sie * aus der vorhandenen Tabelle in die neuen.
Beachten Sie auch, dass Sie auch nur die Tabelle erstellen, können Sie in der relevent Sortierungs interessiert sind (anstelle von Server breit) .So Sie auch so etwas wie tun könnte:
CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )