Verzögerbare Constraints?!

Mahlzeit!

Meine Ausgangssituation sieht in etwa wie folgt aus:

CREATE TABLE x (
    id serial,
    wertx varchar(80)
);

CREATE TABLE y (
    id serial,
    werty1 int2 NOT NULL,
    werty2 int2 NOT NULL,
    CONSTRAINT fkey FOREIGN KEY (werty1) REFERENCES x (id),
    CONSTRAINT unique UNIQUE (werty1, werty2)
);

INSERT INTO y (werty1, werty2) VALUES (1, 1);
INSERT INTO y (werty1, werty2) VALUES (1, 2);

Nun möchte ich in y die Werte von werty2 beider Einträge vertauschen. Meine Frage: Wie mache ich das? In der Doku habe ich schon einiges über verzögerbare Constraints gefunden (Stichwort: DEFERRABLE). Das funktioniert auch für Fremdschlüssel zweier Tabellen, die auf sich selbst zeigen, aber wie sieht das bei Eindeutigkeit aus? Sehe ich den Wald vor lauter Bäumen nicht?

Prinzipiell hätte ich wohl ein paar Lösungsansätze für das beschriebene Problem, aber die erscheinen mir mehr als unsauber, weswegen ich sie hier vorerst nicht zum besten gebe…

Gruß, eazy

Moin!

Na, hat denn niemand eine Idee? :wink:

Da ich eine Lösung benötigte, habe ich das Problem folgendermaßen umgangen:

Es geht in meinem Fall darum, dass zwei Einträge der Tabelle die Werte von werty2 tauschen sollen. Konkreter noch will der Benutzer den Wert eines Eintrags verringern bzw. erhöhen. Dabei soll der Eintrag mit dem jeweils höheren/niedrigeren Wert automatisch geändert werden. In werty2 der Tabelle stehen ausschließlich positive Werte.

Ich habe dazu zwei Funktionen (“up” und “down”) geschrieben, die die Werte tauschen und die Ausgangswerte dabei in Variablen speichern. Außerdem wird in einem Eintrag werty2 temporär auf -1 gesetzt (um eben den Constraint nicht zu verletzen).

So richtig sauber finde ich das ganze jedoch dennoch nicht. Was z.B. wenn der gleiche Fall auftritt und die Einträge nicht ausschließlich positiv sind? Welchen temporären Wert kann ich dann wählen? Also: laßt euch mal was einfallen! :wink:

Gruß, eazy