SQL Server 2008:INSERT如果不退出,则维护唯一列

RuS*_*uSh 1 .net sql sql-server sql-server-2008

我正在使用SQL Server 2008.

NVARCHAR(MAX)在表中有一个列,我想确保它是唯一的.该表有600,000条记录,每天增加50,000条记录.

目前在向表中添加项目之前,我检查它是否存在于表中,如果不存在,我将其插入.

IF NOT EXISTS (SELECT * FROM Softs Where Title = 'example example example.')
BEGIN
INSERT INTO Softs (....)
VALUES (...)
END
Run Code Online (Sandbox Code Playgroud)

我在Title列上没有索引

最近,我在向桌子插入物品时开始超时.

什么是维持独特的正确方法?

如果真的有帮助我可以将NVARCHAR(MAX)更改为NVARCHAR(450)

gbn*_*gbn 6

没有索引是疯狂的.

它会有所帮助,但索引密钥长度只能是900字节.

但是,您可能已经有重复项,因为第二个EXISTS可能在第一个EXISTS之后但在第一个INSERT之前运行.

索引创建将告诉您,并随后防止这种情况.

但是,您可以在重负载下获得错误.

我喜欢的高插入/低重复的方法是JFDI模式.高度并发

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH
Run Code Online (Sandbox Code Playgroud)

  • @sharru - `checksum`可以发生碰撞.根据[本文](http://www.mssqltips.com/tip.asp?tip=1868),使用`hashbytes`可能性较小 (2认同)