【问题标题】:T-SQL: How do I create a unique key that is case sensitive?T-SQL:如何创建区分大小写的唯一键?
【发布时间】:2010-10-03 21:02:19
【问题描述】:

如何在区分大小写的 varchar 字段上创建唯一约束 (SQL Server 2005)?

目前我的约束如下所示:

alter table MyTable
add constraint UK_MyTable_MyUniqueKey unique nonclustered (MyCol)

当我尝试插入以下两个值时,我收到“违反 UNIQUE KEY 约束...”错误。

insert into MyTable (MyCol) values ('ABC')
insert into MyTable (MyCol) values ('abc') --causes a violation of UNIQUE KEY constraint 'UK_MyTable_MyUnqiueKey'

我希望将两个不同大小写的值作为 unqiue 处理。我想它会涉及以下代码,但我不知道它如何改变我的add constraint 语法。

COLLATE SQL_Latin1_General_CP1_CS_AS

【问题讨论】:

  • 您的意思是“区分大小写”还是不区分大小写?如果 ABC 和 abc 的解析相同,那么这是一个“不区分大小写”的比较。你可以重述这个问题
  • 是的 - 你是对的。谢谢
  • 那么,什么排序规则导致“abc”和“ABC”发生冲突? UTF-8?你还记得吗?谢谢。

标签: sql sql-server tsql constraints


【解决方案1】:

这会将列更改为区分大小写。我认为您的约束没有任何变化...

ALTER TABLE mytable 
ALTER COLUMN mycolumn VARCHAR(10) 
COLLATE SQL_Latin1_General_CP1_CS_AS

此列上的任何选择或连接都将因该操作而区分大小写。

【讨论】:

  • 这是否会导致该列上的所有选择也区分大小写?
  • 与此列相关的所有内容都将区分大小写。
  • 您必须放弃约束,运行 ALTER,再次添加 PK 以处理依赖关系
  • 如果该列不仅包含 Latin1 字符,还包含其他字母,以 UTF-8 编码(现在大多数应用程序中的标准),我该怎么做?
【解决方案2】:

您只能设置数据库中数据的大小写敏感(最小的列粒度)。您不能设置索引区分大小写 - 这相当于能够对表达式进行索引,这在某些数据库中是可能的,但不是 Sql Server。

【讨论】:

    猜你喜欢
    • 2013-03-22
    • 2014-01-21
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2012-06-15
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多