sql >> Database >  >> RDS >> PostgreSQL

beperk de waarde van het veld met een waarde uit een andere tabel voordat u schrijft

Je hebt UPDATE niet nodig binnen een trekker. U kunt de waarde toewijzen aan NEW.votes_used

Gebruik zoiets als:

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;

Of

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

Dit moet een BEFORE UPDATE . zijn aanzetten om te werken. (En zoals alle BEFORE UPDATE triggers die het moet RETURN NEW ).

Als u controlebeperking met trigger wilt emuleren, probeer dan iets als:

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. Fout Maximum aantal tekens overschreden in SQL-instructie EDIT:probleem bij het weergeven van tabel

  2. Django manage.py syncdb throwing Geen module met de naam MySQLdb

  3. Rails 3, veld in model wijzigen van string naar datetime type

  4. Hoe varchar tot nu toe te converteren/casten?