如何使datetime2列插入唯一

时间:2009-03-31 15:01:26

标签: .net sql-server datetime

我有一个存储sql server 2008中的股票价格的表。它在符号列和日期列上键入,它是datetime2。在c#app中,插入以高速率发送到表。目前,使用符号和DateTime.Now进行一行,然后插入。 Occationaly可能出现这样的情况,即同一符号的2个滴答声进入,而datetime.now将返回相同的时间,直到毫秒。 我的问题是如何确保我的插入不会对给定的符号使用相同的时间。我知道我可以在db中使用另一个像rowver或somekind of autonumber这样的独特键作为一个解决方案,但即使插入成功,我也不希望给定符号有重复次数。我还考虑过存储最后一次插入时间,如果它相等则只添加一个millesecond。我不确定最好的办法。此外,datetime2接缝比.net日期时间更精确,所以不知道我是否应该尝试在服务器或客户端上解决这个问题。

由于

我想保留每个插入内容,无论出于什么原因,出于性能原因,我不想检查先前的值,因此我将使用的解决方案是标识列。这将允许我保留插入的顺序,同时允许在datetime2中重复。

4 个答案:

答案 0 :(得分:2)

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

使用标识列作为主键,只需在tick + datetime上放置一个索引(如果需要,可以进行聚类)。我不确定你想要什么,但这样你就可以记录他们发生了......

答案 1 :(得分:1)

我认为这个问题的答案取决于符号确实在同一时间进入的情况下您想要做什么?

您可以在符号和日期时间列上创建唯一索引 - 但这会导致两个实例之一的唯一键冲突。如果你正在设计性能,这可能是一项昂贵的练习。

另一种选择是设置一个时间戳列,这样可以确保即使您确实在同一时间获得两个相同的符号,您的插入也不会失败。

真正的问题是 - 你想用第二个相同的符号做什么?在写入之前,您是否可以负担检查表中是否已存在相同的符号和日期时间的费用?那你可以记录并丢弃副本吗?

答案 2 :(得分:1)

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

编辑:...通过将autogenerated属性设置为SYSDATETIME()

答案 3 :(得分:0)

您的数据库是否插入线程安全?即有可能两个插入可能同时发生并且彼此不知道吗?在这种情况下,存储最高并添加毫秒将不起作用。

你可能必须有一个经常性的程序,并在发生碰撞的情况下增加时间。