PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

ограничи стойността на полето със стойност от друга таблица преди запис

Нямате нужда от UPDATE вътре в спусъка. Можете да присвоите стойността на NEW.votes_used

Използвайте нещо като:

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;

Или

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

Това трябва да е BEFORE UPDATE задействане за работа. (И както всички BEFORE UPDATE задейства, трябва да RETURN NEW ).

Ако искате да емулирате ограничение за проверка с тригер - опитайте нещо като:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres - Транспониране на редове в колони

  2. ГРЕШКА:синтактична грешка при или близо до OVER

  3. превърнете отделната стойност на колони в редове postgres

  4. C#, Entity Framework Core &PostgreSql:вмъкването на един ред отнема 20+ секунди

  5. Не може да се извади офсетно-наивно и офсетно-известно време за дати