sql >> Database >  >> RDS >> PostgreSQL

Hoe schrijf je een beperking met betrekking tot een maximaal aantal rijen in postgresql?

Quassnoi heeft gelijk; een trigger zou de beste manier zijn om dit te bereiken.

Hier is de code:

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

Ik heb tabelvergrendeling toegevoegd om situaties te vermijden waarin twee gelijktijdige transacties foto's voor een gebruiker zouden tellen, om te zien dat de huidige telling 1 onder de limiet is, en vervolgens beide in te voegen, waardoor u 1 over de limiet zou gaan. Als u zich daar geen zorgen over maakt, kunt u het beste de vergrendeling verwijderen, omdat dit een knelpunt kan worden met veel toevoegingen/updates.



  1. Zoek en vervang tekst in de hele tabel met behulp van een MySQL-query

  2. Hoe Joda-Time te gebruiken met java.sql.Timestamp

  3. SQL Server-triggers:DML-triggers

  4. Hoe AUTOINCREMENT werkt in SQLite