有没有办法让列既有UNIQUE又有区分大小写?
我希望能够放
ABCDE 和 的 ABCDE
在一个独特的专栏中。
答案 0 :(得分:33)
可以使用唯一约束来强制执行唯一性。
唯一索引是否区分大小写由服务器(或表格)排序规则定义。
您可以使用此查询获取数据库的当前排序规则:
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
你应该得到类似的东西:
SQLCollation
————————————
SQL_Latin1_General_CP1_CI_AS
此处,整理结束时的“CI_AS”表示:CI = Case Insensitive,AS = Accent sensitive。
可以将其更改为您需要的任何内容。如果您的数据库和/或表确实具有区分大小写的排序规则,我希望您的索引的唯一性也区分大小写,例如您的 abcdef 和 ABCDEF 应该都可以作为唯一字符串使用。
马克
更新:
我刚试过这个(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
并且没有关于违反唯一索引的错误。
答案 1 :(得分:4)
如果有人需要在已在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
答案 2 :(得分:0)
我需要从区分大小写的数据库导入数据。当我尝试将主键放在作为源上主键的列上时,由于重复键,我无法执行此操作。我将列(varchar)的排序规则更改为区分大小写(右键单击表,选择“设计”,突出显示要更改的列,然后单击“排序”中的省略号),现在它可以正常工作。 (SQL Server 2008 R2 64位)。
答案 3 :(得分:0)
感谢@Devraj Gadhavi一步一步,因为这正是我需要做的。我即将制作这些脚本但是(使用SSMS 2008R2),我以更加懒惰的方式实现了同样的方式:-)。在树形视图中,我找到了我的表和列,然后右键单击了我想要更改排序规则的列并选择了“修改”。在显示的窗口中,我将属性中的排序规则更改为区分大小写,然后在窗口顶部的开放空间中的任何位置(列表以表格形式列出)中我右键单击并选择“生成更改脚本” ......“