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

मैंने उन स्थितियों से बचने के लिए टेबल लॉकिंग को शामिल किया जहां दो समवर्ती टैनसैक्शन एक उपयोगकर्ता के लिए तस्वीरों की गणना करेंगे, देखें कि वर्तमान गणना सीमा से 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. मैं एक नलबल कॉलम पर प्राथमिक कुंजी के साथ एक टेबल क्यों बना सकता हूं?

  2. पीजीईस्ट, हार्डवेयर बेंचमार्किंग और पीजी परफॉर्मेंस फार्म

  3. रेल:पीजी रत्न स्थापित करने में त्रुटि

  4. कैसे लेनदेन_टाइमस्टैम्प () PostgreSQL में काम करता है

  5. PostgreSQL में हर शब्द के पहले अक्षर को कैपिटलाइज़ कैसे करें