如何在SQL Server中的NVARCHAR(MAX)列上强制实现唯一性?

Kuy*_*nda 3 sql-server sql-server-2008-r2

我在SQL Server 2008 R2中有一个NVARCHAR(MAX)列.我想在该列上设置唯一索引,但唯一索引中包含的列的最大大小为NVARCHAR(450)或900字节.

如何在NVARCHAR(MAX)列上强制实现唯一性?

谢谢!

A-K*_*A-K 5

  1. 在某种哈希上创建一个持久列,例如CHECKSUM.例如:Hash = MyStringHash作为CHECKSUM(MyString)
  2. 在该列上创建一个非唯一索引
  3. 创建一个强制唯一性的触发器.需要索引来加速EXISTS子句中的搜索:

            WHERE   NOT EXISTS ( SELECT 1
                                 FROM   YourTable AS y
                                 WHERE  y.MyStringHash = CHECKSUM(Inserted.MyString)
                                        AND y.MyString = Inserted.MyString) ;
    
    Run Code Online (Sandbox Code Playgroud)

重要提示:您需要针对整理进行测试.如果您使用不区分大小写的排序规则,请确保该触发器不允许"MyTest"和"MYTEST".

如果你寻找一个独特的索引并停下来,你只是在创建一个等待发生的bug.

编辑:在不区分大小写的环境中,我使用CHECKSUM作为持久计算列,它快速,不区分大小写,并且选择性足够.