PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak napisać ograniczenie dotyczące maksymalnej liczby wierszy w postgresql?

Quassnoi ma rację; najlepszym sposobem na osiągnięcie tego byłby wyzwalacz.

Oto kod:

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();

Włączyłem blokowanie tabeli, aby uniknąć sytuacji, w których dwie równoczesne tansakcje zliczałyby zdjęcia dla użytkownika, zobacz, że aktualna liczba jest o 1 poniżej limitu, a następnie oba wstawiają, co spowodowałoby przekroczenie limitu o 1. Jeśli to nie jest dla Ciebie problem, najlepiej usunąć blokadę, ponieważ może stać się wąskim gardłem z wieloma wstawkami/aktualizacjami.



  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 Query Plan, dlaczego szacowanie wierszy jest tak błędne

  2. Jak działa justify_hours() w PostgreSQL

  3. Zapytanie SQL w celu znalezienia rekordu o identyfikatorze, którego nie ma w innej tabeli

  4. Złożony klucz podstawowy wymusza ograniczenia NOT NULL na zaangażowanych kolumnach

  5. Jak utworzyć tablicę w PostgreSQL