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

Как да напиша ограничение относно максимален брой редове в postgresql?

Кваснои е прав; спусъкът би бил най-добрият начин да постигнете това.

Ето кода:

CREATE OR REPLACE FUNCTION enforce_photo_count() RETURNS trigger AS $$
DECLARE
    max_photo_count INTEGER := 10;
    photo_count INTEGER := 0;
    must_check BOOLEAN := false;
BEGIN
    IF TG_OP = 'INSERT' THEN
        must_check := true;
    END IF;

    IF TG_OP = 'UPDATE' THEN
        IF (NEW.owner != OLD.owner) THEN
            must_check := true;
        END IF;
    END IF;

    IF must_check THEN
        -- prevent concurrent inserts from multiple transactions
        LOCK TABLE photos IN EXCLUSIVE MODE;

        SELECT INTO photo_count COUNT(*) 
        FROM photos 
        WHERE owner = NEW.owner;

        IF photo_count >= max_photo_count THEN
            RAISE EXCEPTION 'Cannot insert more than % photos for each user.', max_photo_count;
        END IF;
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER enforce_photo_count 
    BEFORE INSERT OR UPDATE ON photos
    FOR EACH ROW EXECUTE PROCEDURE enforce_photo_count();

Включих заключване на таблицата, за да избегна ситуации, при които две едновременни tansactions ще отчитат снимки за потребител, вижте, че текущият брой е 1 под лимита, и след това и двете вмъкват, което ще ви накара да надхвърлите лимита с 1. Ако това не ви притеснява, най-добре би било да премахнете заключването, тъй като може да се превърне в пречка с много вмъквания/актуализации.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете обобщена таблица в PostgreSQL

  2. Откриване дали дадена стойност съдържа поне една цифрова цифра в PostgreSQL

  3. Как да изчислим разликата между две времеви марки в PostgreSQL

  4. Добавете колона с времеви клеймо с по подразбиране СЕГА() само за нови редове

  5. Унищожаване на Postgres DB на Heroku