2017-11-24 2 views
1

Ich arbeite an einer Marktplatzplattform, auf der ich Benutzerbilanzen als Tabelle für Bilanzänderungen zusammen mit einem vorberechneten Wert in ihrer Benutzerzeile ablege. Auf diese Weise kann ich ihr Guthaben leicht überprüfen, aber in bestimmten Intervallen neu berechnen, um sicherzustellen, dass sie synchron bleiben. HierVerschiedene Tabellen aktualisieren, wenn Zeilen eingefügt werden

ist ein Beispiel dafür, was die Balance Änderungstabelle aussehen könnte:

| id | opening_balance | closing_balance | user_id | 
|----|-----------------|-----------------|---------| 
| 1 | 23.40   | 28.20   | 6  | 
| 2 | 14.70   | 11.10   | 79  | 
| 3 | 117.12   | 107.12   | 20  | 

Wenn eine neue Zeile eingefügt wird, möchte ich die balance Spalt auf dem user_id Bezug auf den neu closing_balance eingefügt aktualisieren.

Von dem, was ich online gefunden habe, habe ich die folgenden jedoch für MySQL statt Postgresql.

CREATE TRIGGER balance_update 
AFTER INSERT ON balance_history 
FOR EACH ROW 
BEGIN 
    UPDATE users 
    SET balance = NEW.closing_balance 
    WHERE id = NEW.user_id; 
END; 

Es ist wie Postgresql sieht erfordert, dass Sie eine benannte Prozedur erstellen, bevor ein Trigger zu schaffen? Nicht sicher, der beste Weg, um dies zu konvertieren.

+0

Siehe Beispiele im Handbuch https://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE –

Antwort

1

Trigger in Postgres haben eine etwas komplexere Syntax als MySQL, weil sie Prozeduren als Aktion ausführen. In diesem Fall können wir eine Funktion definieren, die das gewünschte Update als Ergebnis der Einfügung in der ersten Tabelle ausführt.

CREATE OR REPLACE FUNCTION your_proc() 
RETURNS trigger AS 
$$ 
BEGIN 
    UPDATE users 
    SET balance = NEW.closing_balance 
    WHERE id = NEW.user_id; 
RETURN NEW; 
END; 
$$ 
LANGUAGE 'plpgsql'; 

CREATE TRIGGER balance_update 
AFTER INSERT ON balance_history 
FOR EACH ROW 
EXECUTE PROCEDURE your_proc(); 
+0

Ich erhalte 'Syntaxfehler bei oder in der Nähe von "END" ' –

+0

@BenedictLewis Typo, ich hatte' RETURN NEW' anstelle von 'RETURN NEW;' mit einem Semikolon am Ende. –

+0

Ah, ich bekomme jetzt 'Syntax Fehler bei oder in der Nähe von" RETURN "' –

Verwandte Themen