2016-07-21 34 views
1

Ich habe eine Datenbanktabelle wie folgt:Primärschlüsselbedingung doppelte Schlüssel Ausnahmen mit Zeitreihendaten und 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); 

Diese Tabelle durch Sätze von Preis/Größendaten von einem Webdienst abgerufen bevölkert ist, die im Wesentlichen der Zeit -Serie in der Natur. Soweit ich das beurteilen kann (und ich habe eine Vergleichslogik in meinen Code geschrieben, um sicher zu gehen), werden Preis und Größe niemals in einem einzigen Satz von Einträgen dupliziert, die vom Webservice abgerufen wurden. Sie können jedoch in nachfolgenden Anfragen nach Preis-/Größendaten, die sich auf den gleichen Läufer beziehen, dupliziert werden.

Ich bekomme intermittierende Primärschlüssel Einschränkung doppelte Schlüssel Ausnahmen, obwohl ich meine Schlüssel aus einer hohen Auflösung Datum Zeit Wert sowie den Rest der Tabelle Spalten bilden. In diesem Stadium erwäge ich, den zusammengesetzten Schlüssel zugunsten eines automatisch generierten Primärschlüssels fallen zu lassen. Kann jemand vorschlagen, warum dies aufgrund des Tabellenschemas passieren könnte? Ich halte es für unwahrscheinlich, dass ich versuche, zwei getrennte Sätze von Preis-/Größendaten mit doppelten Werten gleichzeitig einzugeben, wenn man die Art des Codes und die Auflösung des Datumswerts berücksichtigt. Ich denke, es ist jedoch möglich - ich verwende asynchrone Methoden, um mit der Datenbank und dem Webservice zu interagieren.

Dank

+0

bieten Sie einen Wert für die Zeitstempel oder verwenden Sie den Standardwert erzeugt durch 'SYSUTCDATETIME()' – derpirscher

+0

Hallo, Ich habe versucht, auf den Standardwert erzeugt, indem sie sich ‚SYSUTCDATETIME()‘ als sowie einen Wert über 'DateTime.UtcNow()' zu liefern - hatte das gleiche Problem in beiden Fällen. Ich habe eine Lösung basierend auf was @bds in Bezug auf Präzision in seinem Kommentar unten erwähnt. – nefuller

Antwort

1

Ist jeder in loser Schüttung mehrere Zeilen in die Tabelle runner_id Einfügen? Es ist möglich, dass der gleiche Preis und die gleiche Größe in weniger als 100 Nanosekunden verarbeitet werden. Dies würde dazu führen, dass sie nicht einzigartig sind.

SQL Server ruft die Datums- und Uhrzeitwerte mithilfe der GetSystemTimeAsFileTime() - Windows-API ab. Die Genauigkeit hängt von der Computerhardware und Windows-Version ab, auf der die Instanz von SQL Server ausgeführt wird. Die Genauigkeit dieser API ist fest auf 100 Nanosekunden festgelegt. Die Genauigkeit kann mithilfe der Windows-API GetSystemTimeAdjustment() ermittelt werden.

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

+0

Danke! Dies scheint der Fall gewesen zu sein. Ich habe hier eine Lösung gefunden, um eindeutige Zeitstempel zu erzeugen: [link] (http://stackoverflow.com/questions/1416139/how-to-get-timestamp-of-tick-precision-in-net-c). Ich habe die Lösung von @Ian Mercer benutzt und ich bekomme nicht mehr die Ausnahmen. – nefuller