T-SQL: как создать уникальный ключ с учетом регистра?

Как создать уникальное ограничение для поля varchar с учетом регистра (SQL Server 2005)?

В настоящее время мое ограничение выглядит так:

alter table MyTable
add constraint UK_MyTable_MyUniqueKey unique nonclustered (MyCol)

Когда я пытаюсь вставить следующие два значения, я получаю ошибку «Нарушение ограничения UNIQUE KEY ...».

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

Я бы хотел, чтобы два значения с разными регистрами обрабатывались как unqiue. Я предполагаю, что это будет включать следующий код, но я не знаю, как он меняет мой синтаксис add constraint.

COLLATE SQL_Latin1_General_CP1_CS_AS

person Seibar    schedule 27.01.2009    source источник
comment
Вы имеете в виду "чувствительный к регистру" или "нечувствительный"? если ABC и abc разрешаются одинаково, то это случай "нечувствительного" сравнения. Вы можете переформулировать вопрос   -  person keithwarren7    schedule 28.01.2009
comment
да вы правы. Спасибо   -  person Seibar    schedule 28.01.2009
comment
Итак, какое сопоставление привело к столкновению abc и ABC? UTF-8? Ты помнишь? Спасибо.   -  person wha7ever    schedule 24.09.2019


Ответы (2)


В результате в столбце будет учитываться регистр. Я не думаю, что есть какие-то изменения в вашем ограничении ...

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

Любые выборки или объединения в этом столбце в результате этой операции станут чувствительны к регистру.

person Jason Punyon    schedule 27.01.2009
comment
Приведет ли это к тому, что все выборки в этом столбце также будут чувствительны к регистру? - person Seibar; 28.01.2009
comment
Все, что связано с этим столбцом, будет чувствительно к регистру. - person Jason Punyon; 28.01.2009
comment
Вам придется отказаться от ограничения, запустить ALTER, снова добавить PK, чтобы справиться с зависимостью. - person gbn; 28.01.2009
comment
Как это сделать, если столбец состоит не только из символов Latin1, но и из символов других алфавитов, закодированных в UTF-8 (как это принято сегодня в большинстве приложений)? - person Holger Jakobs; 04.05.2017

Вы можете установить только чувствительность к регистру данных в базе данных (наименьшая степень детализации столбца). Вы не можете установить чувствительность к регистру индекса - это было бы эквивалентно возможности индексировать по выражению, что возможно в некоторых базах данных, но не в Sql Server.

person dkretz    schedule 27.01.2009