Есть ли способ сделать столбец как UNIQUE, так и Case Sensitive?
Я хочу, чтобы можно было поставить
ABCDE а также ABCDE
в уникальном столбце.
Есть ли способ сделать столбец как UNIQUE, так и Case Sensitive?
Я хочу, чтобы можно было поставить
ABCDE а также ABCDE
в уникальном столбце.
Уникальность может быть применена с помощью уникального ограничения.
Независимо от того, является ли уникальный индекс чувствительным к регистру, определяется сервером (или таблицей) сортировка.
Вы можете получить текущую сортировку вашей базы данных с помощью этого запроса:
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
и нет ошибки об уникальном индексе, который нарушается.
В случае, если кому-то нужно сделать это в существующей таблице, которая уже имеет 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
Мне нужно было импортировать данные из базы данных, чувствительной к регистру. Когда я попытался поместить первичный ключ в столбец, который является основным ключом в источнике, я не смог бы этого сделать из-за дубликатов ключей. Я изменил сортировку для столбца (varchar) на чувствительный к регистру (щелкните правой кнопкой мыши по таблице, выберите "Дизайн", выделите столбец, который хотите изменить, и щелкните по elipsis в Collation), и теперь он отлично работает. (SQL Server 2008 R2 64 бит).
Спасибо @Devraj Gadhavi за шаг за шагом, поскольку это именно то, что мне нужно было сделать. Я собирался сделать эти сценарии, но потом (используя SSMS 2008R2), я достиг такого же более ленивого:-). В древовидном представлении я нашел таблицу и столбец, а затем щелкнул правой кнопкой мыши по столбцу, в котором я хотел изменить сортировку, и выбрал "Изменить". В отображаемом окне я изменил сортировку в свойствах на чувствительный к регистру, а затем в любом месте открытого пространства в верхней части окна (где столбцы перечислены в форме таблицы). Я щелкнул правой кнопкой мыши и выбрал "Generate Change Script..."