views:

2117

answers:

2

How do I create a unique constraint on a varchar field that is case sensitive (SQL Server 2005)?

Currently my constraint looks like this:

alter table MyTable
add constraint UK_MyTable_MyUniqueKey unique nonclustered (MyCol)

When I try to insert the following two values, I get a "Violation of UNIQUE KEY constraint..." error.

insert into MyTable (MyCol) values ('ABC')
insert into MyTable (MyCol) values ('abc') --causes a violation of UNIQUE KEY constraint 'UK_MyTable_MyUnqiueKey'

I would like the two differently-cased values to be handled as unqiue. I imagine it will involve the following code, but I do not know how it changes my add constraint syntax.

COLLATE SQL_Latin1_General_CP1_CS_AS
+7  A: 

This will change the column to be case sensitive. I don't think there's any change to your constraint...

ALTER TABLE mytable 
ALTER COLUMN mycolumn VARCHAR(10) 
COLLATE SQL_Latin1_General_CP1_CS_AS

Any selects or joins on this column will become case sensitive as a result of this operation.

Jason Punyon
Will this cause all selects on that column to be case-sensitive as well?
Terrapin
Everything involved with this column will be case sensitive.
Jason Punyon
You'll have to drop the constraint, run the ALTER, add the PK again to deal with the dependency
gbn
+1  A: 

You can only set the case-sensitivity of the data in the database (smallest granularity of column). You can't set case-sensitivity of an index - that would be equivalent to being able to index on an expression, which is possible in some databases but not Sql Server.

le dorfier