Datensatz anhand des Index ersetzen

Hier kommen Posts zu anderen Datenbanken als PostgreSQL rein.
Antworten
bamdenied
Neuer Benutzer
Beiträge: 7
Registriert: Di 19. Apr 2011, 14:45

Datensatz anhand des Index ersetzen

Beitrag von bamdenied » Mi 20. Apr 2011, 09:09

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

ads
Erfahrener Benutzer
Beiträge: 4148
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitrag von ads » Mi 20. Apr 2011, 09:43

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.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support

castorp
Erfahrener Benutzer
Beiträge: 1023
Registriert: Sa 27. Jun 2009, 22:24

Beitrag von castorp » Mi 20. Apr 2011, 10:00

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
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

ads
Erfahrener Benutzer
Beiträge: 4148
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitrag von ads » Mi 20. Apr 2011, 10:04

Zwichen UPDATE und INSERT hast du aber eine Race Condition.
Die musst du ggf. über einen Lock abfangen.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support

castorp
Erfahrener Benutzer
Beiträge: 1023
Registriert: Sa 27. Jun 2009, 22:24

Beitrag von castorp » Mi 20. Apr 2011, 10:22

ads hat geschrieben: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.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

bamdenied
Neuer Benutzer
Beiträge: 7
Registriert: Di 19. Apr 2011, 14:45

Beitrag von bamdenied » Mi 20. Apr 2011, 10:58

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

Vielen Dank
Mark Brings

Antworten