Update

Hallo,

ich habe mir das hier angesehen:
PostgreSQL: Documentation: Manuals: PostgreSQL 8.1: UPDATE

nun habe ich versucht darauf basierend das hier zu Basteln:

BEGIN;
-- other operations
SAVEPOINT sp1;
INSERT INTO klassenspeicher (adressen_id,verband_id,altersklasse_id,bogenklasse_id)
VALUES(1, 2,3,3);
-- Assume the above fails because of a unique key violation,
-- so now we issue these commands:
ROLLBACK TO sp1;
UPDATE klassenspeicher SET 
altersklasse_id = 4,
bogenklasse_id =5
WHERE adressen_id = 1 AND verband_id = 2;
-- continue with other operations, and eventually
COMMIT;

Nur wenn ich das ausführe passiert nichts.

jetzt habe ich

INSERT INTO klassenspeicher (adressen_id,verband_id,altersklasse_id,bogenklasse_id)
VALUES(1, 2,3,3);

ausgeführt um den Inhalt in die Tabelle zu bekommen -> klappt.
danach Starte ich wieder das obere “Script” und jetzt kommt ne Fehlermeldung.

FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »klassen_prim«
DETAIL: Schlüssel »(adressen_id, verband_id)=(1, 2)« existiert bereits.

Wo liegt den nun mein Fehler, laut der o.g. Seite müsste es doch so klappen.

Gruß
mc.mauser

Du hast oben das ROLLBACK auch ausgeführt, ja?


Andreas

Ich habe den SQL direkt aus PGAdmin rauskopiert bzw. andersrum.

Den ganzen Text von “BEGIN;” bis “COMMIT;” in PGAdmin per Copy Paste eingefügt und nix passiert, bzw. es kommt die Fehlermeldung, wenn ich schon was in der Tabelle habe.

Gruß
mc.mauser

Wenn man schon mit Copy&Paste den Guttenberg spielt, sollte man aber dennoch über das nachdenken, was man da tut. Du fügst was in die Tabelle ein, machst ein ROLLBACK, und wunderst Dich, daß das Eingefügte nicht drin ist in der Tabelle. Dämmert es nun?

Andreas

Ich glaube, er wundert sich, dass der Befehl nach dem Rollback (also der Teil mit ‘UPDATE klassenspeicher …’) nicht ausgeführt wird.

Ja genau ich wunder mich weshalb der Update Teil nicht klappt.

Den mein Problem ist:
Füge Datensatz ein, wenn Datensatz vorhanden, bzw Unique verletzt dann mach ein Update. Bei MySQL hat ein Update gereicht wenn nix da war wurde Datensatz erzeugt, aber in Postgres geht das halt nicht so, bin ich halt neu in Postgres, und in der Doku.(siehe ganz oben der Link) ist es ja so beschrieben oder ? (Mein Englisch ist sehr mies)

mc.mauser

Btw, Version 8.1 ist … äh veraltet.

Jo die Version 8.1 ist veraltet aber in der Aktuellen Doku.

postgresql-9.0-A4.pdf (von der Seite: PostgreSQL: Manuals) steht auf Seite 1383 genau das gleiche.

Wenn das aus der Doku nicht klappt, woher soll ich den wissen wie es klappt ?

Gruß
mc.mauser

Hi,

das Problem liegt bei pgAdmin:
Standardmässig ist dort ein automatisches Rollback bei Fehlern aktiviert.
Lässt sich in den Optionen abschalten.

VG
hkocam

Hallo,

das Ausschalten des Rollback in PGadmin hat auch nix gebracht.
Habe jetzt im Web ne Lösung gefunden:
So gehts:

CREATE FUNCTION set_klassenspeicher(adresse bigint, verband bigint, ak bigint, bk bigint) RETURNS void
AS $$BEGIN
  LOOP
    UPDATE klassenspeicher
    SET altersklasse_id = ak, bogenklasse_id = bk
    WHERE adressen_id = adresse AND verband_id = verband;
    IF found THEN
      RETURN;
    END IF;
    BEGIN
      INSERT INTO klassenspeicher adressen_id,verband_id,altersklasse_id,bogenklasse_id)
      VALUES (adresse,verband,ak,bk);
      RETURN;
      EXCEPTION WHEN unique_violation THEN
        -- concurrent insertion
    END;
  END LOOP;
END;$$
LANGUAGE plpgsql;

Gruß
mc.mauser

Hi,

Bei mir schon, was ist anders?
Nur damit nicht der Eindruck ensteht, daß das Beispiel in der Doku fehlerhaft wäre, denn genau dieses Beispiel funktioniert.

VG
hkocam

Als Alternative würde ich einfach mal psql verwenden. Schon um pgAdminIII als Fehlerquelle auszuschließen.