关于.net:如何保持datetime2列插入的唯一性

How to keep datetime2 column inserts unique

我有一个表,用于存储sql server 2008中的股票价格变动。它在符号列和作为datetime2的datecolumn上键入。在C#应用程序中,插入内容会以很高的速率发送到表中。当前,使用符号和DateTime.Now创建一行,然后将其插入。在某些情况下,可能会出现以下情况:同一符号出现2个滴答,而datetime.now将返回相同的时间(以毫秒为单位)。
我的问题是如何确保给定符号的插入内容不会使用相同的时间。我认为我可以在数据库中使用另一个唯一键,例如rowver或某种自动编号作为解决方案,但是即使插入成功,我也不希望给定符号重复两次。我还考虑过要存储最后的插入时间,如果相等则只添加一毫秒。我不确定执行此操作的最佳方法。而且datetime2的接缝比.net datetime具有更多的精确度,因此不知道我是否应该尝试在服务器或客户端上解决此问题。

谢谢

无论出于何种原因,我都希望保留每个插入内容,并且出于性能方面的考虑,我不想检查以前的值,因此我要使用的解决方案是Identity列。这将允许我保留插入顺序,同时允许在datetime2中重复。


请勿在密钥中使用日期时间。

使用一个身份列作为主键,然后在刻度日期时间上放置一个索引(如果需要,可以将其聚集)。我不确定您要不要使用这些公仔,但是通过这种方式,您将能够记录它们的发生...


不要使用C#DateTime.Now,即使DateTime.Now是线程安全的,它也可以返回两个相同的值。使用Datetime2列的自动生成的属性会更好。

编辑:...,通过将自动生成的属性设置为SYSDATETIME()


我认为,如果符号确实在同一时间出现,对此的答案取决于您要执行的操作?

您可以在符号和datetime列上创建唯一索引-但这将导致两个实例之一的唯一键冲突。如果您正在为性能而设计,这可能是一个昂贵的练习。

另一个选择是有一个timestamp列,这将确保即使您确实恰巧在同一时间获得两个相同的符号,插入也不会失败。

真正的问题是-您要如何处理第二个相同的符号?在写表之前,您能负担得起检查表中是否已经存在相同符号和日期时间的费用吗?这样您便可以记录并丢弃重复项?


您的数据库插入线程安全吗? IE。是否有可能同时发生两次插入并且彼此不知道?在这种情况下,存储最大值并添加毫秒是行不通的。

在发生冲突时,您可能必须执行常规过程并增加时间。