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

Posted

技术标签:

【中文标题】SQL Server 2008 区分大小写的唯一列【英文标题】:SQL Server 2008 Unique Column that is Case Sensitive 【发布时间】:2009-10-03 16:49:09 【问题描述】:

有没有办法让一列既 UNIQUE 又区分大小写?

我希望能够放

abcdeABCDE

在一个独特的列中。

【问题讨论】:

@Mitch:也许他正面临 #10 案 :-) 你永远不知道...... 简单地说,我想要更多的选择。我希望表格变得非常大,因此有 62 个字符选项而不是 36 个。abc...ABC...123...此外,该字段仅使用 5 个字符。 这个帖子基本上是对另一个帖子***.com/questions/1513911/…的补充 @MitchWheat:案例 #10:base-64 编码的哈希值 @mwolfe02:虽然这可能是一个有效的用例,但它不是 5 年前发帖者所面临的...... 【参考方案1】:

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

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

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

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

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

【讨论】:

我尝试了 marc 列出的脚本,它在 SQL Server 2008 32 位上运行良好。 似乎无法在 UI 中按表执行此操作。但是可以在为整个数据库创建数据库的过程中完成,这似乎有点过于深远了。 我很欣赏每个表的 SQL 脚本,它很容易粘贴并验证 SELECT * FROM TestUnique WHERE [string] = 'ABC' 只返回一行,如我所料 【参考方案2】:

如果有人需要在已经在 varchar/nvarchar 列上定义了 unique key/index 的现有表上执行此操作,这里是脚本。

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)的排序规则更改为区分大小写(右键单击表格,选择设计,突出显示要更改的列,然后单击排序规则中的省略号),现在它工作正常。 (SQL Server 2008 R2 64 位)。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于SQL Server 2008 区分大小写的唯一列的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:为啥不区分大小写的列上的 SELECT 比区分大小写的列更快?

SQL Server数据库使用什么排序规则?

更新表以按分组列显示总计 SQL Server 2008 R2

SQL Server 的 LIKE 运算符是不是区分大小写?

SQL Server 2008 除了语句

SQL Server2008窗口计算