主键约束使用时间序列数据和DATETIME2复制键异常

时间:2016-07-21 16:03:11

标签: c# sql sqldatatypes

我有一个数据库表如下:

CREATE TABLE some_table
(   
    price                       FLOAT                   NOT NULL,
    size                        FLOAT                   NOT NULL,   
    retrieved                   DATETIME2               DEFAULT SYSUTCDATETIME(),
    runner_id                   INT                     NOT NULL,
    FOREIGN KEY (runner_id)     REFERENCES runner(id),
    PRIMARY KEY (retrieved, price, size, runner_id)
);

CREATE INDEX some_table_index ON some_table (runner_id);

此表由从Web服务检索的一组价格/大小数据填充,该服务本质上是时间序列的。据我所知(我已经在我的代码中放置了一些比较逻辑以确保)价格和大小永远不会在从Web服务检索的一组条目中重复。但是,它们可能会在随后的与同一个跑步者相关的价格/尺寸数据请求中重复出现。

我正在获得间歇性的主键约束重复键异常,即使我正在从高分辨率日期时间值以及表列的其余部分形成我的键。在这个阶段,我正在考虑删除复合键以支持自动生成的主键。任何人都可以根据表模式建议为什么会发生这种情况?考虑到代码的性质和日期时间值的分辨率,我认为我不太可能同时插入具有重复值的两组独立的价格/尺寸数据。我想这是可能的 - 我使用异步方法与数据库和Web服务进行交互。

由于

1 个答案:

答案 0 :(得分:1)

每个runner_id是否批量插入多个行?可能在不到100纳秒的时间内处理相同的价格和尺寸。这将导致它们不是唯一的。

  

SQL Server使用GetSystemTimeAsFileTime()Windows API获取日期和时间值。准确性取决于运行SQL Server实例的Windows的计算机硬件和版本。此API的精度固定为 100纳秒。可以使用GetSystemTimeAdjustment()Windows API确定准确性。

https://msdn.microsoft.com/en-us/library/bb630387.aspx