bei folgender Query verstehe ich die Fehlermeldung nicht:
INSERT INTO t_warnmeldung_corona (
cellid,ewz,sterberate,faelle,todesfaelle,
faelle_pro_100000,betroffenenrate,datum,faelle_letzte_7_tage_pro_100000,genesene,
bundesland_nr,regierungsbezirk_nr,landkreis_nr,gemeinde_nr
) VALUES (1001000,90164,1.940639,876,17,971.562930,0.971563,timestamp with time zone '22.01.2021, 00:00',181.890777,0,0,0,0,0)
ON CONFLICT WHERE (datum = '2021-01-22 00:00:00+01' AND cellid=1001000) DO NOTHING
Die Fehlermeldung lautet:
Fehler in der SQL-Abfrage: FEHLER: Syntaxfehler bei »WHERE«
LINE 6: ON CONFLICT **WHERE (datum = ‘2021-01-22 00:00:00+01’ AND cell…
Wie im Handbuch dokumentiert ist, erwartet ON CONFLICT erwartet den Namen eines (unique) Constraints oder die Liste der Spalten die in einem Unique Constraint enthalten sind. Ein WHERE kann man da nicht verwenden.
Wenn Du also sowohl die TIMESTAMP Spalte als auch cellid “unique” haben willst, musst Du einen entsprechenden Index anlegen:
create unique index on t_warnmeldung_corona (datum, cellid);
dann kannst Du
ON CONFLICT (datum, cellid)
verwenden.
Aber einen Timestamp als unique zu definieren finde ich merkwürdig. Die Spalte sollte wohl eher ein DATE sein (schon wegen dem nichtsagenden Namen)
angeben muss. Da meine Datentabelle eine “dumme” Tabelle ist, habe ich eine andere Lösung gefunden. Vor dem Einfügen der Daten frage ich das Datum des ältesten Datensatzes ab. Das funktioniert, weil die Daten täglich zum selben Zeitpunkt erhoben werden.
Ja, aber das ist ein zusätzliches WHERE welches verwendet werden kann, wenn die Spalten (bzw. der Index- oder Constraintname) einen partiellen Index referenzieren, also ein (unique) Index der mit WHERE ... angelegt wurde. Das dient dazu, wenn es mehrere partielle Indizes mit der Spaltenliste gibt, den richtigen auszuwählen.