PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Feldwert vor dem Schreiben mit Wert aus einer anderen Tabelle begrenzen

Sie brauchen kein UPDATE innerhalb eines Triggers. Sie können den Wert NEW.votes_used zuweisen

Verwenden Sie so etwas wie:

BEGIN
    IF (NEW.votes_used > (SELECT votes_available FROM vote_totals 
     WHERE vote_totals.user_id = NEW.user_id)) THEN
        NEW.votes_used := (SELECT votes_available FROM vote_totals 
         WHERE vote_totals.userID = NEW.user_id);
    END IF;
    RETURN NEW;
END;

Oder

BEGIN
    NEW.votes_used := LEAST(NEW.votes_used, (SELECT votes_available 
                                             FROM vote_totals 
                                             WHERE vote_totals.userID = NEW.user_id));
    RETURN NEW;
END;

Dies muss ein BEFORE UPDATE sein Auslöser zur Arbeit. (Und wie alle BEFORE UPDATE Trigger muss es RETURN NEW ).

Wenn Sie Check Constraint mit Trigger emulieren möchten, versuchen Sie etwas wie:

BEGIN
    IF (NEW.votes_used > (SELECT votes_available  
                          FROM vote_totals 
                          WHERE vote_totals.user_id = NEW.user_id)) 
    THEN RAISE EXCEPTION 'Not enough votes';
    END IF;
    RETURN NEW;
END;