ioBroker / ioBroker.sql

Store history data in SQL Database: MySQL, PostgreSQL or SQLite
MIT License
45 stars 24 forks source link

Cannot insert INSERT INTO ts_number #304

Open rapunzel72 opened 1 year ago

rapunzel72 commented 1 year ago

Ich schreibe per javascript Temperaturdaten alle 5 Minuten in in einen Datenpunkt. Dieser Datenpunkt wir über den SQL Adapter in eine postgresql Datenbank geschrieben. Die Einstellungen für das Logging ist dem ersten Screenshot zu entnehmen. Ab un zu kommt es im Logfile zu folgender Fehlermeldung:

2023-04-10 07:01:53.188 - error: sql.0 (32475) Cannot insert INSERT INTO ts_number (id, ts, val, ack, _from, q) VALUES (4, 1681102502871, 54.7, true, 2, 0),(4, 1681102802872, 54.7, true, 2, 0),(4, 1681102502853, 54.7, true, 3, 0),(4, 1681102802872, 54.9, true, 3, 0);: error: doppelter Schlüsselwert verletzt Unique-Constraint »ts_number_pkey« (id: T_SpeicherUnten)

Diese Fehlermeldung tritt auf, da zwei Datensätze mit identischem Primary Key, bestehend aus id und ts geschrieben werden sollen, jedoch aus unterschiedlichen Quellen. Auch in den Verlaufsdaten des Datenpunktes (Screenshot 2) sind die gleichen Daten aus dem Datenpunk doppelt vorhanden, einmal mit der Quelle sql.0 adapter und einmal mit Quelle javascript.0 adapter. In der Regel haben die Daten aus den beiden Quellen unterschiedliche ts und somit können diese ohne Fehler in der SQL Datenbank gespeichert werden.

Ist es möglich die Daten durch geeignete Parameterwahl nur einer ausgewählten Quelle in der Datenbank zu speichern? Gibt es andere Möglichkeiten, den Fehler oben zu vermeiden?

Screenshots & Logfiles image

image

Versions:

Apollon77 commented 1 year ago

ja muss man anschauen und fixen/aussortieren. Die interessante Frage an sich ist warum es bei dir passiert?

Itchy-TM commented 1 year ago

Ich habe einen ähnlichen Fehler

Cannot insert INSERT INTO iob.ts_number (id, ts, val, ack, _from, q) VALUES (516, 1683334519950, 880, 1, 7, 0);: Error: Duplicate entry '516-1683334519950' for key 'PRIMARY' (id: 0_userdata.0.Verbrauch.Allgemein.Harvest.ErzeugungPV+BWR)

grafik

grafik

Aus irgendeinem Grund verknüpft der die Werte von id und ts und versucht das als einen Wert zu übergeben?

rapunzel72 commented 1 year ago

Aus der Datenpunkt id und dem Timestamp ts wird der Primary key für die SQL datenbank gebildet. Da es zwei Quellen für den Datenpunkt gibt - SQL und Javascript, die mit dem gleichen ts versehen werden, kommt es zu der obigen Fehlermeldung. Da es eine Abhängigkeit zwischen den Quellen geben muss, zuerst tritt der javascript Datenpunkt auf und dann der SQL Datenpunkt, daß diese unterschiedliche ts bekommen. Scheinbar ist der Ablauf so schnell, daß beide den gleichen ts bekommen!

Apollon77 commented 1 year ago

@Itchy-TM Hier wäre das Script interessant und ggf auch die Datenpunkt Einstellungen