Datensatz anhand des Index ersetzen

Hallo,

ich möchte das ein Datensatz erstellt wird wenn der angegebene Index nicht vorhanden ist und wenn er vorhanden ist, sollen alle Atribute ersetzt werden.
Ich hab mich bereits mit REPLACE auseinander gesetzt, aber mit dieser Funktion auch kein Lösungsansatz erarbeiten können.

Ein kleines Beispiel:

artikelnummer, Name , preis

wie könnte ich den Datensatz veränder bzw. erstellen(fals nicht vorhanden) wenn ich die selbe Artikelnummer eingeb?


Vielen Dank
mfg Mark

REPLACE? Bist du dir sicher, im richtigen Forum zu sein?

Ansonsten tipp doch mal in die Suche auf der PostgreSQL-Webseite den Begriff “upsert” ein.

Du suchst nach einem MERGE Befehl, den PostgreSQL (noch) nicht hat.

Das übliche Vorgehen ist, dass Du einfach ein UPDATE machst und dann prüfst ob ein Datensatz geändert wurde.
Falls kein Datensatz geändert wurde, wird der INSERT gemacht.

Im Handbuch ist auch ein Beispiel wie man das elegant in einer Funktion kapselt:
http://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-UPSERT-EXAMPLE

Zwichen UPDATE und INSERT hast du aber eine Race Condition.
Die musst du ggf. über einen Lock abfangen.

Klar, der folgende INSERT kann natürlich scheitern - aber das kann schliesslich jeder INSERT.
Ich bin kein Freund von (table) locks, und würde deswegen eher versuchen den Fehler beim INSERT sauber zu behandeln (auch hier wieder: wie bei jedem anderen INSERT auch).

Wie man genau damit umgehen soll, hängt (wie immer) stark vom Anwendungsfall und den Anforderungen ab.

Alles klar, weiß ich bescheid ich probier es erst einmal =D

Vielen Dank
Mark Brings