SQL Server 2008 区分大小写的唯一列

问题描述 投票:0回答:5

有没有办法使列既唯一又区分大小写?

我希望能够放

abcdeABCDE

在一个独特的专栏中。

sql sql-server t-sql sql-server-2008
5个回答
46
投票

可以通过唯一约束来强制执行唯一性。

唯一索引是否区分大小写由服务器(或表)的排序规则定义。

您可以使用此查询获取数据库的当前排序规则:

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

你应该得到类似的东西:

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

这里,排序规则末尾的“CI_AS”表示:CI = 不区分大小写,AS = 区分重音。

可以将其更改为您需要的任何内容。如果您的数据库和/或表确实具有区分大小写的排序规则,我希望您的索引的唯一性也将区分大小写,例如您的 abcdefABCDEF 都应该可以接受作为唯一字符串。

马克

更新:

我刚刚尝试过这个(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

并且没有关于违反唯一索引的错误。


5
投票

如果有人需要在已在

unique key/index
/
varchar
列上定义了
nvarchar
的现有表上执行此操作,请使用以下脚本。

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

1
投票

如果您在树视图中右键单击表格并选择表格设计,然后单击列名称,底部会出现一个名为“列属性”的面板,您可以在其中使用以下命令设置排序规则选项用户界面。

MSSMS Collation Options in Design view


0
投票

我需要从区分大小写的数据库导入数据。当我尝试将主键放在源上主键的列上时,由于重复的键,我无法做到这一点。我将列 (varchar) 的排序规则更改为区分大小写(右键单击表,选择设计,突出显示要更改的列,然后单击排序规则中的省略号),现在它工作正常。 (SQL Server 2008 R2 64 位)。


0
投票

感谢@Devraj Gadhavi 的一步一步,因为这也正是我需要做的。我本来打算制作这些脚本,但后来(使用 SSMS 2008R2),我以一种更懒惰的方式实现了相同的目标:-)。在树视图中,我找到了表和列,然后右键单击我想要更改排序规则的列并选择“修改”。在显示的窗口中,我将属性中的排序规则更改为区分大小写的排序规则,然后在窗口顶部的开放空间中的任何位置(其中列以表格形式列出)我右键单击并选择“生成更改脚本” ...”

© www.soinside.com 2019 - 2024. All rights reserved.