Gibt es eine Möglichkeit, eine Spalte sowohl UNIQUE als auch Case Sensitive zu machen?
Ich möchte in der Lage sein, die
abcde y ABCDE
in einer eindeutigen Spalte.
Gibt es eine Möglichkeit, eine Spalte sowohl UNIQUE als auch Case Sensitive zu machen?
Ich möchte in der Lage sein, die
abcde y ABCDE
in einer eindeutigen Spalte.
Die Eindeutigkeit kann mit einer eindeutigen Einschränkung erzwungen werden.
Ob der eindeutige Index Groß-/Kleinschreibung beachtet oder nicht, wird durch die Server- (oder Tabellen-) Kollation .
Mit dieser Abfrage können Sie die aktuelle Sortierung Ihrer Datenbank ermitteln:
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
und Sie sollten etwas erhalten wie:
SQLCollation
————————————
SQL_Latin1_General_CP1_CI_AS
Hier bedeutet das "CI_AS" am Ende der Sortierung: CI = Case Insensitive, AS = Accent sensitive.
Dies kann nach Bedarf geändert werden. Wenn Ihre Datenbank und/oder Tabelle eine Groß-/Kleinschreibung unterscheidet, würde ich erwarten, dass die Eindeutigkeit Ihres Indexes ebenfalls von der Groß-/Kleinschreibung abhängt, z.B. Ihre abcdef y ABCDEF sollten beide als eindeutige Zeichenketten akzeptiert werden.
Marc
UPDATE
Ich habe dies gerade ausprobiert (SQL Server 2008 Developer Edition x64) - funktioniert bei mir (meine Datenbank verwendet im Allgemeinen die Kollation "Latin1_General_CI_AS", aber ich kann pro Tabelle / pro VARCHAR-Spalte sogar eine andere definieren):
CREATE TABLE TestUnique
(string VARCHAR(50) COLLATE SQL_Latin1_General_Cp1_CS_AS)
CREATE UNIQUE INDEX UIX_Test ON dbo.TestUnique(string)
INSERT INTO dbo.TestUnique(string) VALUES ('abc')
INSERT INTO dbo.TestUnique(string) VALUES ('ABC')
SELECT * FROM dbo.TestUnique
und ich komme zurück:
string
ABC
abc
und keine Fehlermeldung, dass der eindeutige Index verletzt wurde.
Ich habe das von marc aufgeführte Skript ausprobiert und es hat bei mir gut funktioniert, auf SQL Server 2008, 32bit.
Es scheint, dass es keine Möglichkeit gibt, dies in der Benutzeroberfläche pro Tabelle zu tun. Es kann jedoch während der Datenbankerstellung für die gesamte Datenbank durchgeführt werden, was ein wenig zu weitreichend erscheint.
Für den Fall, dass jemand dies bei einer bestehenden Tabelle tun muss, die bereits eine unique key/index
definiert auf einem varchar
/ nvarchar
Spalte, hier ist das Skript.
ALTER TABLE [YourTable] DROP CONSTRAINT [UIX_YourUniqueIndex]
GO
ALTER TABLE [YourTable] ALTER COLUMN [YourColumn] [nvarchar](50) COLLATE Latin1_General_CS_AS NOT NULL;
GO
ALTER TABLE [YourTable] ADD CONSTRAINT [UIX_YourUniqueIndex] UNIQUE NONCLUSTERED
(
[YourColumn] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Ich musste Daten aus einer Datenbank importieren, die Groß- und Kleinschreibung unterscheidet. Als ich versuchte, den Primärschlüssel in die Spalte zu setzen, die der Primärschlüssel in der Quelle ist, konnte ich das nicht tun, weil es doppelte Schlüssel gab. Ich änderte die Sortierreihenfolge für die Spalte (varchar) auf Groß- und Kleinschreibung (Rechtsklick auf die Tabelle, wählen Sie Design, markieren Sie die Spalte, die Sie ändern möchten, und klicken Sie auf das Auslassungszeichen in Sortierreihenfolge) und jetzt funktioniert es gut. (SQL Server 2008 R2 64 bit).
Danke @Devraj Gadhavi für die Schritt-für-Schritt-Anleitung, denn das ist genau das, was ich auch tun musste. Ich war kurz davor, diese Skripte zu erstellen, aber dann habe ich (mit SSMS 2008R2) das Gleiche auf eine etwas faulere Weise erreicht :-). In der Strukturansicht suchte ich meine Tabelle und Spalte und klickte dann mit der rechten Maustaste auf die Spalte, deren Sortierung ich ändern wollte, und wählte "Ändern". Im angezeigten Fenster änderte ich die Sortierung in den Eigenschaften auf die Groß- und Kleinschreibung, dann klickte ich irgendwo in den offenen Bereich im oberen Teil des Fensters (wo die Spalten in Tabellenform aufgelistet sind) mit der rechten Maustaste und wählte "Änderungsskript generieren..."
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
12 Stimmen
@Mitch: vielleicht steht er vor Fall #10 :-) man weiß ja nie....
0 Stimmen
Ganz einfach: Ich möchte mehr Möglichkeiten haben. Ich erwarte, dass die Tabelle wirklich sehr groß wird, so dass ich 62 Zeichenoptionen anstelle von 36 habe. abc... ABC... 123... Außerdem verwendet das Feld nur 5 Zeichen.
0 Stimmen
Dieser Beitrag ist im Grunde eine Ergänzung zu einem anderen Beitrag stackoverflow.com/questions/1513911/
0 Stimmen
@MitchWheat: Fall #10: base-64 kodierte Hash-Werte
0 Stimmen
@mwolfe02: Das mag zwar ein gültiger Anwendungsfall sein, aber es war nicht der, mit dem der Poster vor 5 Jahren konfrontiert war....
0 Stimmen
Es war ein URL-Verkürzer.