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.
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.
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?
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)
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;
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.