0

在 SQL Server 2008 R2 中,我有一个具有以下结构的表

(
  Id     INT NOT NULL PRIMARY KEY,
  Left1  INT NOT NULL,
  Left2  INT NULL,
  Right1 NVARCHAR(128) NOT NULL,
  Right2 NVARCHAR(128) NOT NULL,
  Right3 NVARCHAR(128) NULL,
  Right4 NVARCHAR(128) NULL,
  Right5 NVARCHAR(128) NULL,
  Right6 NVARCHAR(128) NULL
)

用于将来自系统(“左”)的左 1 和左 2 映射到右 1-6,再到另一个系统(“右”)。

我需要确保左列是唯一的,我已经使用唯一索引完成了,并且左右组合也是唯一的。

我不能在这里使用索引,因为支持的最大列大小是 900 字节。我需要避免在 Left、Right 和 Left2Right 中拆分表格——因为我的用例太乏味且容易出错。

执行组合唯一性的正确方法是什么?


我的要求是:

  • 在整个表中,Left1 和 Left2 必须没有具有相同值的行(已解决)
  • 在整个表中,Left1、Left2、Right1、Right2、Right3、Right4、Right5、Right6 必须没有具有相同值的行(我需要帮助)
4

2 回答 2

4

完全没有必要添加第二个约束。

您对

Left1, Left2

将防止重复值

Left1, Left2, Right1, Right2, Right3, Right4, Right5, Right6.

如果不先复制前 2 个,就无法复制所有 8 个字段。

于 2011-04-12T17:19:40.513 回答
1

一个想法:创建所有可能的“右”值的查找表,为它们分配整数代理键,在 Left2Right 表中使用这些代理键,并在它们上建立唯一约束。非规范化和丑陋的罪恶,但它可以解决问题。


(添加)

您还可以尝试构建值的哈希值并对其进行约束。穷人的版本是使用校验和添加一个计算行:

ALTER TABLE MyTable
 Add RightHash AS checksum(Left1, Left2, Right1, Right2, Right3, Right4, Right5, Right6)

并在其上添加一个唯一约束(它可能必须是一个持久的计算列才能做到这一点)。这样做的主要问题是不同的初始值集可能会产生相同的校验和值。您可以通过 hashbytes 函数使用一种(更多)强大的散列算法,它具有相同的限制(可能重复的散列值),但发生冲突的机会会小得多。

于 2011-04-12T16:18:40.143 回答