Sql server 在SQL Server中的唯一非聚集索引中忽略\u DUP\u KEY=ON
想询问SQL Server中具有IGNORE_DUP_密钥的唯一非聚集索引。以下是索引:Sql server 在SQL Server中的唯一非聚集索引中忽略\u DUP\u KEY=ON,sql-server,ignore,ignore-duplicates,Sql Server,Ignore,Ignore Duplicates,想询问SQL Server中具有IGNORE_DUP_密钥的唯一非聚集索引。以下是索引: /****** Object: Index [TIMESTAMP_NONCLUSTERED] Script Date: 1/7/2015 1:30:22 PM ******/ CREATE UNIQUE NONCLUSTERED INDEX [TIMESTAMP_NONCLUSTERED] ON [dbo].[Events] ( [Timestamp] ASC, [EventID]
/****** Object: Index [TIMESTAMP_NONCLUSTERED] Script Date: 1/7/2015 1:30:22 PM ******/
CREATE UNIQUE NONCLUSTERED INDEX [TIMESTAMP_NONCLUSTERED] ON [dbo].[Events]
(
[Timestamp] ASC,
[EventID] ASC
)
INCLUDE ( [Type],
[Category],
[Node],
[DoID],
[AssociatedDoID],
[OpaqueData]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = ON, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
请问这是否是忽略重复插入的最佳方式?此外,如果重新启动SQL Server,由于它是一个非聚集索引,这是否仍然有效?SQL Server将首先比较什么,时间戳然后是EventID?SQL是如何做到的?它就像一个SQL Server将查看时间戳然后查看EventID的查询一样
顺便说一句,EventID是guid格式的
谢谢IMO表设计有点可疑-您有一个名为
Events
的表,它的Guid列EventId
不能用作主键,即使将它与另一个字段组合后,它仍然不够唯一,无法用作唯一的NC索引?插入表的客户端具有重试机制,需要通过网络。在某些情况下(正常情况下不太可能发生),客户端会重试要插入的同一事件。@StuartLC,您知道SQL Server是否会先查看EventID之前的时间戳吗?是的,索引是按从左到右的顺序计算的。需要注意的一点是,所有非聚集索引上都存在clustereed键(由聚集索引使用)。因此,例如,如果EventId本身是主键,并且用作聚集索引,则时间戳的NC索引不需要显式地将EventId
添加到NC索引中。除了@StuartLC提到的臭烘烘的设计之外,为了解决此问题,我将使用MERGE语句插入或更新行,取决于它是否已经存在。