sql >> Databasteknik >  >> RDS >> PostgreSQL

begränsa fältets värde med värde från en annan tabell före skrivning

Du behöver inte UPDATE inuti en avtryckare. Du kan tilldela värdet till NEW.votes_used

Använd något som:

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;

Eller

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

Detta måste vara en BEFORE UPDATE trigger att arbeta. (Och som alla BEFORE UPDATE utlöser den måste RETURN NEW ).

Om du vill emulera kontrollbegränsning med trigger - prova något i stil med:

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;


  1. SQL Datediff - hitta datediff mellan rader

  2. Återställer raderad mysql-databas

  3. Tillåten minnesstorlek på 8589934592 byte är slut

  4. ODP.NET Managed library löser alias, men 32-bitars bibliotek gör det