Подтвердить что ты не робот

Уникальный столбец SQL Server 2008, чувствительный к регистру

Есть ли способ сделать столбец как UNIQUE, так и Case Sensitive?

Я хочу, чтобы можно было поставить

ABCDE а также ABCDE

в уникальном столбце.

4b9b3361

Ответ 1

Уникальность может быть применена с помощью уникального ограничения.

Независимо от того, является ли уникальный индекс чувствительным к регистру, определяется сервером (или таблицей) сортировка.

Вы можете получить текущую сортировку вашей базы данных с помощью этого запроса:

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

и вы должны получить что-то вроде:

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

Здесь "CI_AS" в конце сортировки означает: CI = нечувствительный к регистру, AS = чувствительный.

Это может быть изменено на все, что вам нужно. Если в вашей базе данных и/или таблице есть сортировка с учетом регистра, я бы ожидал, что уникальность вашего индекса будет также чувствительна к регистру, например. ваш abcdef и ABCDEF должен быть приемлемым как уникальные строки.

Марк

UPDATE:

Я просто попробовал это (SQL Server 2008 Developer Edition x64) - работает для меня (моя база данных обычно использует "Latin1_General_CI_AS", но я могу определить другую для каждой таблицы/столбца VARCHAR даже):

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

и я вернусь:

string
ABC
abc

и нет ошибки об уникальном индексе, который нарушается.

Ответ 2

В случае, если кому-то нужно сделать это в существующей таблице, которая уже имеет unique key/index, определенную в столбце varchar/nvarchar, вот script.

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

Ответ 3

Мне нужно было импортировать данные из базы данных, чувствительной к регистру. Когда я попытался поместить первичный ключ в столбец, который является основным ключом в источнике, я не смог бы этого сделать из-за дубликатов ключей. Я изменил сортировку для столбца (varchar) на чувствительный к регистру (щелкните правой кнопкой мыши по таблице, выберите "Дизайн", выделите столбец, который хотите изменить, и щелкните по elipsis в Collation), и теперь он отлично работает. (SQL Server 2008 R2 64 бит).

Ответ 4

Спасибо @Devraj Gadhavi за шаг за шагом, поскольку это именно то, что мне нужно было сделать. Я собирался сделать эти сценарии, но потом (используя SSMS 2008R2), я достиг такого же более ленивого:-). В древовидном представлении я нашел таблицу и столбец, а затем щелкнул правой кнопкой мыши по столбцу, в котором я хотел изменить сортировку, и выбрал "Изменить". В отображаемом окне я изменил сортировку в свойствах на чувствительный к регистру, а затем в любом месте открытого пространства в верхней части окна (где столбцы перечислены в форме таблицы). Я щелкнул правой кнопкой мыши и выбрал "Generate Change Script..."