2009-10-03 20 views
20

¿Hay alguna manera de hacer que una columna sea UNICA y sensible a mayúsculas y minúsculas?Columna única de SQL Server 2008 que distingue entre mayúsculas y minúsculas

Quiero ser capaz de poner

abcde y ABCDE

en una columna única.

+11

@Mitch: tal vez está enfrentando el caso # 10 :-) nunca se sabe .... –

+0

En pocas palabras, quiero más opciones. Espero que la tabla sea realmente grande, así que tenga 62 opciones de caracteres en lugar de 36. abc ... ABC ... 123 ... Además, el campo solo usa 5 caracteres. –

+0

Esta publicación es básicamente complementaria a otra publicación http://stackoverflow.com/questions/1513911/most-efficient-way-to-unique-random-string –

Respuesta

29

La singularidad se puede aplicar con una restricción única.

Si el índice único distingue entre mayúsculas y minúsculas está definido por la colación del servidor (o la tabla).

que pueda obtener el cotejo actual de su base de datos con esta consulta:

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation; 

y usted debe obtener algo como:

SQLCollation 
———————————— 
SQL_Latin1_General_CP1_CI_AS 

Aquí, el "CI_AS" al final de la colación significa: CI = Insensible a mayúsculas, AS = Acentuado.

Esto puede cambiarse a lo que sea que necesite. Si su base de datos y/o tabla tiene una intercalación sensible a las mayúsculas y minúsculas, espero que la singularidad de su índice también distinga entre mayúsculas y minúsculas, p. su abcdef y ABCDEF deben ser ambos aceptables como cadenas únicas.

Marc

ACTUALIZACIÓN:

simplemente he intentado esto (Server 2008 Developer x64 Edition SQL) - funciona para mí (mi base de datos generalmente se utiliza el "Latin1_General_CI_AS cotejo, pero puede definir un uno por diferentes mesa/por columna VARCHAR par):

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 

y regrese:

string 
ABC 
abc 

y no hay error sobre la violación del índice único.

+1

Probé la secuencia de comandos enumerada por Marc y funcionó bien para mí, en SQL Server 2008, 32 bits. – RBarryYoung

+0

Parece que no hay forma de hacer esto por tabla en la interfaz de usuario. Sin embargo, se puede hacer durante la creación de la base de datos para toda la base de datos, lo que parece demasiado extenso. –

0

Necesitaba importar datos de una base de datos sensible a mayúsculas y minúsculas. Cuando traté de poner la clave principal en la columna que es la clave principal en la fuente, no pude hacerlo debido a las claves duplicadas. Cambié la intercalación de la columna (varchar) por mayúsculas y minúsculas (haga clic con el botón derecho en la tabla, elija Diseño, resalte la columna que desea cambiar y haga clic en elipsis en Colación) y ahora funciona bien. (SQL Server 2008 R2 64 bit).

+1

Un voto abajo sin una explicación. De buen tono. – bvj

+0

Bienvenido al universo SO. – cbmeeks

3

En caso de que alguno hay que hacerlo en una tabla existente que ya tiene una unique key/index definido en una columna varchar/nvarchar, aquí es el guión.

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 
0

Gracias @Devraj Gadhavi para el paso a paso ya que esto es exactamente lo que tenía que hacer así. Estaba a punto de hacer esos scripts pero luego (usando SSMS 2008R2), logré lo mismo de una manera más perezosa :-).En la vista de árbol, ubiqué mi tabla y columna y luego hice clic derecho en la columna en la que quería cambiar la intercalación y elegí 'Modificar'. En la ventana mostrada, cambié la intercalación en las propiedades por mayúsculas y minúsculas, luego en cualquier parte del espacio abierto en la sección superior de la ventana (donde las columnas se enumeran en forma de tabla) Hice clic derecho y elegí "Generar secuencia de comandos de cambio" ... "

Cuestiones relacionadas