sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur skriver man en begränsning angående ett max antal rader i postgresql?

Quassnoi har rätt; en trigger skulle vara det bästa sättet att uppnå detta.

Här är koden:

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

Jag inkluderade tabelllåsning för att undvika situationer där två samtidiga transaktioner skulle räkna foton för en användare, se att det aktuella antalet är 1 under gränsen och sedan infoga båda, vilket skulle få dig att gå 1 över gränsen. Om det inte är ett problem för dig är det bäst att ta bort låsningen eftersom det kan bli en flaskhals med många insatser/uppdateringar.



  1. Spring Boot CRUD Exempel med MySQL

  2. Postgresql-fråga mellan datumintervall

  3. Felsökning av SQL Server CPU-prestandaproblem

  4. Så här fixar du "Procedur förväntar sig parametern '@statement' av typen 'ntext/nchar/nvarchar'." Fel i SQL Server