varbinary列的唯一约束

时间:2015-02-03 12:07:49

标签: sql constraints

我在SQL中有一个varbinary列,我希望这个列始终是唯一的。但是,我发现SQL不允许在varbinary列上创建唯一约束。 有没有解决方法来确保这种独特性?也许通过使用其他类型的约束,或其他什么?

谢谢!

3 个答案:

答案 0 :(得分:0)

我猜你有VARBINARY(MAX)。它的长度为2^31-1个字节,但密钥的最大长度应为900个字节。所以你实际上受限于VARBINARY(900)。如果大小为VARBINARY <= 900,则可以添加唯一索引。

作为一种变通方法,如果表中已有相同的值,则可以添加Trigger和回滚插入。

答案 1 :(得分:0)

如果varbinary相当短,那么您可以创建十六进制表示的计算列并对其进行唯一约束。参考SQL Server converting varbinary to string,了解如何将varbinary转换为十六进制字符串。

Edit1 :正如@GiorgiNakeuri所指出的,唯一约束的限制是900字节,所以十六进制为450字节。

Edit2 :或者,如果您可以减少(非常)小的失败风险,那么您可以创建一个带有varbinary值的MD5哈希值的计算列,并对其进行唯一约束。请参阅HASHBYTES的文档。

答案 2 :(得分:-1)

您可以将列设为主键。脚本测试表如下所示

/****** Object:  Table [dbo].[Table_1]    Script Date: 02/03/2015 12:19:22 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Table_1](
    [test] [varbinary](50) NOT NULL,
    [rf] [nchar](10) NULL,
 CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
(
    [test] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO