2009-03-04 17 views
1

Ich habe eine Tabelle (eine vorhandene Tabelle mit Daten darin) und diese Tabelle hat eine Spalte UserName. Ich möchte, dass dieser Benutzername eindeutig ist. So füge ich eine Einschränkung wie folgt aus:Eindeutige Einschränkung für Tabellenspalte

ALTER TABLE Users 
ADD CONSTRAINT [IX_UniqueUserUserName] UNIQUE NONCLUSTERED ([UserName]) 

Jetzt halte ich den Fehler bekommen die Benutzer duplizieren in dieser Tabelle existieren. Aber ich habe die Datenbank mit der folgenden Abfrage überprü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 mit 1 als NumberOfUsers. Also keine Duplikate dort. Aber wenn ich überprüfe die Benutzername er mich nicht sehen folgendes Ergebnis: er versagt So apperently

beluga 
béluga 

ein „e“ und „E“ oder „e“ zu vergleichen ... Es ist wie er dies ignoriert , gibt es eine Möglichkeit, dass sql diese Akzente nicht ignoriert, wenn der einzigartige Schlüssel contraint hinzugefügt wird.

LÖSUNG:

THX an euch habe ich die Lösung gefunden. Dies das Problem behoben:

ALTER TABLE Users 
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS 
+1

Dies scheint mit dem ein Problem zu sein Datenbanksortierung. Auf welche Kollatierung ist es eingestellt? –

Antwort

7

Die Sortierung Sie wahrscheinlich verwenden ignoriert Fall und Akzente beim Vergleich. Sie müssen die Sortierung ändern.

  • Latin1_General_CI_AI Fall Ignoriert und Akzente
  • Latin1_General_CI_AS nicht

Liste der here Sortierungsnamen SQL Server Akzente ignorieren.

+1

Aber die richtige Abfrage hätte Ihnen dieses Problem gezeigt: D –

1

Wie Andrew Barrett sagt, erkennt die Standard-Sortierung in MySQL Akzente nicht korrekt.

Ändern Sie die Sortierung Ihrer Felder zu UTF8_unicode_ci und es sollte Akzente richtig sehen.

ci bedeutet, dass die Groß-/Kleinschreibung nicht beachtet wird, und Sie können eine andere Sortierung verwenden, wenn der Fall wichtig ist.

Sie können eine neue Tabelle mit der neuen Kollatierung erstellen und dann * aus der vorhandenen Tabelle in die neue kopieren.

5

Ihre Abfrage-Gruppen von UserID auch - Sie wollen das nicht tun.

Verwendung:

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

Ihre Anfrage würde zeigen, nur von Benutzern mit dem gleichen Namen und die gleiche Benutzer-ID. Oder vielleicht, bestellen Sie die Daten von COUNT(*), so dass die letzte Zeile, die sich zeigt, höchstwahrscheinlich der Unruhestifter ist?

Sie könnten auch Probleme mit der Sortierung haben, wie andere vorgeschlagen haben, aber normalerweise wäre GROUP BY konsistent.

2

Vermutlich ist UserId Ihr Primärschlüssel. Da es sich um einen Teil dessen handelt, nach dem Sie gruppieren, erhalten Sie garantiert eine einzelne Zeile pro Gruppe.Entfernen Sie die Spalte "userId" aus Ihrer Gruppe durch.

0

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önnten:

CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL) 
Verwandte Themen