2016-05-09 6 views
1

ich eine Tabelle in PostgreSQL 9.4 haben:Constraint auf Summe aus Reihen

user_votes (
    user_id int, 
    portfolio_id int, 
    car_id int 
    vote int 
) 

Ist es möglich, eine Einschränkung auf den Tisch zu legen, um ein Benutzer max 99 Punkt mit in jedem Portfolio zu bewerten haben kann? Dies bedeutet, dass ein Benutzer mehrere Zeilen haben kann, die aus der gleichen user_id und portfolio_id bestehen, aber unterschiedliche car_id und vote. Die Summe der Stimmen sollte niemals 99 überschreiten, aber es kann zwischen verschiedenen Autos platziert werden.

So tun:

INSERT INTO user_vores (user_id, portfolio_id, car_id, vote) VALUES 
    (1, 1, 1, 20), 
    (1, 1, 7, 40), 
    (1, 1, 9, 25) 

würde alles erlaubt sein, aber wenn man versucht, etwas hinzuzufügen, die 99 Stimmen übersteigen soll, wie eine andere Zeile fehlschlagen:

INSERT INTO user_vores (user_id, portfolio_id, car_id, vote) VALUES 
    (1, 1, 21, 40) 

Antwort

1

Leider nein, wenn man versuchte, schaffen so ein constraint Sie diese Fehlermeldung angezeigt wird:

ERROR: aggregate functions are not allowed in check constraints 

Aber das wunderbare l an Postgresql ist, dass es immer mehr als eine Möglichkeit gibt, eine Katze zu häuten. Sie können BEFORE trigger verwenden, um zu überprüfen, ob die Daten, die Sie einfügen möchten, unseren Anforderungen entsprechen.

Row-Level, bevor gebrannt Trigger können null kehren die Trigger Manager zu signalisieren, den Rest der Operation für diese Zeile überspringen (dh nachfolgenden Triggern nicht gebrannt werden, und das Insert/UPDATE/DELETE tut nicht für diese Zeile). Wenn ein Nicht-Null-Wert zurückgegeben wird, wird die Operation mit diesem Zeilenwert fortgesetzt.

In Ihrem Trigger Sie die Anzahl der Stimmen

SELECT COUNT(*) into vote_count FROM user_votes WHERE user_id = NEW.user_id 

Jetzt zählen würde, wenn vote_count 99 Sie geben NULL zurück, und die Daten werden nicht eingefügt werden.

Verwandte Themen