2016-07-21 12 views
1

とキーの例外を複製:主キー制約は、次のように私は、データベーステーブルを持っている時系列データとDATETIME2

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サービスから取得された単一のエントリセットに重複することはありません。ただし、同じランナーに関連する価格/サイズデータの後続要求で複製されることがあります。

私は高解像度の日付時刻の値と他のテーブルの列から自分のキーを形成していますが、断続的な主キー制約が重複するキー例外が発生しています。この段階では、自動生成された主キーの代わりに複合キーを削除することを検討しています。誰もがなぜこれがテーブルスキーマに基づいて起こっているかもしれないかを提案できますか?私は、コードの性質と日付の時間値の分解能を考慮して、2つの別々の価格/サイズデータセットを重複した値で同時に挿入しようとは考えていません。私はそれが可能だと思います - 私はデータベースとWebサービスと対話する非同期メソッドを使用しています。

ありがとう

+0

、あなたのタイムスタンプの値を提供しているか、あなたは ' – derpirscher

+0

こんにちは)' SYSUTCDATETIME(によって生成されたデフォルト値を使用している、私は「)SYSUTCDATETIME(」によって生成されたデフォルト値に頼ってみましたとして、 「DateTime.UtcNow()」を介して値を提供するだけでなく、両方のケースで同じ問題が発生しました。私は以下の彼のコメントの正確さに関して@bdsが言及したものに基づいた解決策を持っています。 – nefuller

答えて

1

複数の行を一括してテーブルに挿入していますか?同じ価格とサイズが100ナノ秒未満で処理される可能性があります。これは彼らが一意ではないという結果に終ります。

SQL ServerはGetSystemTimeAsFileTime()Windows APIを使用して日付と時刻の値を取得します。精度は、SQL Serverのインスタンスが実行されているコンピュータのハードウェアとWindowsのバージョンによって異なります。このAPIの精度は100ナノ秒に固定されています。精度は、GetSystemTimeAdjustment()Windows APIを使用して判断できます。

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

+0

ありがとう!これはそうだったようです。私はユニークなタイムスタンプを生成するためのソリューションを見つけました。[link](http://stackoverflow.com/questions/1416139/how-to-get-timestamp-of-tick-precision-in-net-c) @Ian Mercerのソリューションを使用しましたが、もう例外はありません。 – nefuller

関連する問題