PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menulis batasan mengenai jumlah baris maksimum di postgresql?

Quassnoi benar; pemicu akan menjadi cara terbaik untuk mencapai ini.

Ini kodenya:

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

Saya menyertakan penguncian tabel untuk menghindari situasi di mana dua transaksi bersamaan akan menghitung foto untuk pengguna, melihat bahwa jumlah saat ini adalah 1 di bawah batas, dan kemudian keduanya memasukkan, yang akan menyebabkan Anda melampaui 1 batas. Jika itu bukan masalah bagi Anda, sebaiknya lepaskan penguncian karena dapat menjadi hambatan dengan banyak sisipan/pembaruan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ikhtisar Penawaran Amazon RDS &Aurora untuk PostgreSQL

  2. Mengaudit PostgreSQL Menggunakan pgAudit

  3. 'otentikasi kata sandi gagal untuk postgres pengguna'

  4. Hapus instalan PostgreSQL 9.0.4 sepenuhnya dari Mac OSX Lion?

  5. Dialek perlu diberikan secara eksplisit pada v4.0.0