Cal*_*der 5 sql-server constraint sql-server-2008-r2 string unique-constraint
鉴于以下 CREATE TABLE 语句:
CREATE TABLE [dbo].[Unit]
(
[id] SMALLINT NOT NULL IDENTITY(1,1),
[name] VARCHAR(100) NOT NULL,
CONSTRAINT [PK_Unit] PRIMARY KEY CLUSTERED ([id]),
CONSTRAINT [UQ_Unit_Name] UNIQUE ([name])
)
Run Code Online (Sandbox Code Playgroud)
如何在不违反 UNIQUE 约束的情况下允许以下两个字符串共存?
INSERT INTO dbo.Unit (Name) VALUES('e³m³/day')
INSERT INTO dbo.Unit (Name) VALUES('e3m3/day')
Run Code Online (Sandbox Code Playgroud)
任何见解表示赞赏。
编辑
当前整理是 Latin1_General_CI_AS
编辑
除非有人有更好的选择,否则我似乎必须使用 Latin1_General_BIN 并在我需要的几个地方手动处理 CI……如果没有提供更好的解决方案,我会将其转换为答案。
为什么不将该列整理为区分大小写?我认为你不需要诉诸二进制。这似乎工作正常,请注意它可能会影响排序、比较、联合等:
CREATE TABLE [dbo].[Unit]
(
[id] SMALLINT NOT NULL IDENTITY(1,1),
[name] VARCHAR(100) COLLATE Latin1_General_CS_AS NOT NULL ,
CONSTRAINT [PK_Unit] PRIMARY KEY CLUSTERED ([id]),
CONSTRAINT [UQ_Unit_Name] UNIQUE ([name])
);
GO
INSERT INTO dbo.Unit (Name) VALUES('e³m³/day')
INSERT INTO dbo.Unit (Name) VALUES('e3m3/day')
Run Code Online (Sandbox Code Playgroud)
结果:
1 row(s) affected.
1 row(s) affected.
Run Code Online (Sandbox Code Playgroud)
现在,这适用于您问题中的示例,但是很难说它是否适用于您的整个需求集。您可能有与您不同但在区分大小写方面没有区别对待的字符,例如:
INSERT INTO dbo.Unit (Name) VALUES('ß')
INSERT INTO dbo.Unit (Name) VALUES('ss')
Run Code Online (Sandbox Code Playgroud)
结果:
1 row(s) affected.
Run Code Online (Sandbox Code Playgroud)
进而:
消息 2627,级别 14,状态 1,第 2 行
违反 UNIQUE KEY 约束“UQ_Unit_Name”。无法在对象“dbo.Unit”中插入重复键。重复的键值为 (ss)。
该语句已终止。
在这种情况下,您可能需要使用二进制文件。
归档时间: |
|
查看次数: |
1066 次 |
最近记录: |