变量二进制列的唯一约束条件

4

我在SQL中有一个varbinary列,我希望这个列始终是唯一的。然而,我发现SQL不允许在varbinary列上创建唯一约束。

有没有什么解决办法来确保这种唯一性?也许通过使用其他类型的约束或其他方式?

谢谢!

4个回答

2
如果varbinary相对较短,您可以创建一个十六进制表示的计算列,并在其上放置唯一约束条件。请参考SQL Server将varbinary转换为字符串以了解如何将varbinary转换为十六进制字符串。 编辑1: 正如@GiorgiNakeuri所指出的那样,唯一约束的限制是900个字节,因此十六进制为450个字节。 编辑2: 或者,如果您可以容忍(非常)小的失败风险,则可以创建一个带有varbinary值MD5哈希的计算列,并在其上放置唯一约束条件。请参阅HASHBYTES文档。

有其他的方法吗?如果长度是个问题怎么办?可以使用其他类型的约束条件或者其他什么东西吗? - user225206
我认为Edit2是一个相当不错的方法,我以前也用过它。与其使用计算列,我会在触发器中使用HASHBYTES将哈希值存储在另一列中。 - CSquared

1
我猜你使用的是 VARBINARY(MAX)。它的长度为 2^31-1 字节,但是键的最大长度应该是 900 字节。所以你实际上只能使用 VARBINARY(900)。如果 VARBINARY 的大小小于或等于 900,则可以添加唯一索引。
作为解决方法,你可以添加 Trigger 并回滚插入操作,如果表中已经存在相同的值。

0
你可以将该列设为主键。下面是示例的测试表格。
/****** 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

不需要主键,如果varbinary字段超过900个字节,它将失败。 - Rhys Jones
是的,我同意,只是在演示varbinary可以被设置为唯一的前提是其长度小于900字节。 - Ewan

0

一种更简单的解决方案是通过在插入或更新列之前检查要插入或更新的值是否存在来手动维护该列的唯一性。

例如:

DECLARE @Exists BIT = (
SELECT  CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END
FROM    [Schema].[Table]
WHERE   [DecryptedColumn] = @NewValueToCheck
)
IF (@Exists = 0)
BEGIN
-- Insert or Update
END
ELSE
-- Return Error
BEGIN
END

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接