PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

limiter la valeur du champ avec la valeur d'une autre table avant l'écriture

Vous n'avez pas besoin de UPDATE à l'intérieur d'un déclencheur. Vous pouvez attribuer la valeur à NEW.votes_used

Utilisez quelque chose comme :

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;

Ou

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

Cela doit être un BEFORE UPDATE déclencheur pour fonctionner. (Et comme tous BEFORE UPDATE déclenche il doit RETURN NEW ).

Si vous souhaitez émuler la contrainte de vérification avec le déclencheur, essayez quelque chose comme :

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;