【问题标题】:SQL Server 2008: INSERT if not exits, maintain unique columnSQL Server 2008:如果不存在则插入,保持唯一列
【发布时间】:2011-04-11 09:15:09
【问题描述】:

我使用的是 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

我在标题列上没有索引

最近,我在向表中插入项目时开始出现超时。

维护唯一性的正确方法是什么?

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

【问题讨论】:

  • 您预计有多少重复项?没有? AKA 应该是所有新行?
  • 这真的很难说,但大约 5-10% 的插入尝试会因为重复项而被取消..
  • RE:您的最后一句话更改为NVARCHAR(900) 还不够。它需要是 NVARCHAR(450) 才能在其上创建唯一约束。如果可能的话,为什么是NVARCHAR(max)
  • @Martin Smith:正确。我可以使用 nvarchar(450) 或 varchar(900)。但这会导致我丢失一些超过 900 的标题或丢失其他非英语的标题。
  • 为什么很难判断有多少重复条目正在创建/尝试?

标签: .net sql sql-server sql-server-2008


【解决方案1】:

没有索引太疯狂了。

这会有所帮助,但索引键长度只能是 900 字节。

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

索引创建会告诉您,并随后防止这种情况发生。

但是,在重负载下可能会出错。

对于高插入/低重复,我最喜欢的方法是 JFDI 模式。高并发

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH

【讨论】:

  • 谢谢,我会得到什么样的错误? “但是,在负载过重的情况下可能会出错。”
  • 您可能已经有重复的原因相同:唯一不同的是来自唯一索引的错误
  • 您的意思是在创建索引后,当我插入重复项时会因为重复而出错?或者你的意思是生病得到其他错误?
  • Cool ,所以我可以执行上述操作并使用校验和列上的索引。
  • @sharru - checksum 可以产生冲突。根据this articlehashbytes 的可能性较小
猜你喜欢
  • 2012-08-08
  • 2011-09-01
  • 2016-11-07
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 2015-07-06
  • 2011-07-01
  • 1970-01-01
相关资源
最近更新 更多