डिफ़ॉल्ट रूप से नियम वर्तमान कार्रवाई में चीज़ें जोड़ें :
लेकिन एक INSTEAD नियम आपको क्रिया को बदलने की अनुमति देता है:
इसलिए, मुझे लगता है कि आप INSTEAD निर्दिष्ट करना चाहते हैं :
CREATE OR REPLACE RULE ignore_duplicate_inserts AS
ON INSERT TO mytable
WHERE (EXISTS ( SELECT mytable.id
FROM mytable
WHERE mytable.id = new.id)) DO INSTEAD NOTHING;
INSTEAD के बिना, आपका नियम अनिवार्य रूप से कह रहा है "INSERT करें और फिर कुछ न करें" जब आप "INSERT के बजाय, कुछ भी न करें" और, AFAIK, DO INSTEAD NOTHING
कहना चाहते हैं। ऐसा करेंगे।
मैं PostgreSQL नियमों का विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि "INSTEAD" जोड़ना काम करना चाहिए।
अपडेट करें :araqnid को धन्यवाद हम जानते हैं कि :
तो इस स्थिति में कोई नियम काम नहीं करेगा। हालांकि, COPY FROM के दौरान ट्रिगर सक्रिय हो जाते हैं ताकि आप INSERT से पहले लिख सकें। ट्रिगर जो NULL लौटाएगा जब उसे डुप्लिकेट पंक्तियों का पता चला:
उस ने कहा, मुझे लगता है कि आप araqnid के "इसे एक अस्थायी तालिका में लोड करें, इसे साफ करें, और इसे अंतिम गंतव्य पर कॉपी करें" के साथ बेहतर होगा, आपके जैसे थोक लोडिंग ऑपरेशन के लिए एक अधिक समझदार समाधान होगा।पी>