इसका कारण आपको अजीब लगता है कि आप इंसर्ट ऑपरेशन के हिस्से के रूप में काउंटर पर वेतन वृद्धि के बारे में सोच रहे हैं, और इसलिए "कुछ भी नहीं" का अर्थ "कुछ भी नहीं बढ़ाना" होना चाहिए। आप इसे चित्रित कर रहे हैं:
- बाधा के विरुद्ध सम्मिलित करने के लिए मानों की जाँच करें
- यदि डुप्लिकेट का पता चला है, तो निरस्त करें
- वृद्धि क्रम
- डेटा डालें
लेकिन वास्तव में, इंक्रीमेंट सम्मिलित करने का प्रयास करने से पहले . होना चाहिए . एक SERIAL
Postgres में कॉलम को DEFAULT
. के रूप में लागू किया गया है जो nextval()
. को निष्पादित करता है एक बाध्य SEQUENCE
. पर कार्य करें . इससे पहले कि DBMS डेटा के साथ कुछ भी कर सके, उसके पास स्तंभों का एक पूरा सेट होना चाहिए, इसलिए संचालन का क्रम इस प्रकार है:
- अनुक्रम को बढ़ाने सहित, डिफ़ॉल्ट मानों को हल करें
- बाधा के विरुद्ध सम्मिलित करने के लिए मानों की जाँच करें
- यदि डुप्लिकेट का पता चला है, तो निरस्त करें
- डेटा डालें
इसे सहज रूप से देखा जा सकता है यदि डुप्लिकेट कुंजी ऑटोइनक्रिकमेंट फ़ील्ड में ही है:
CREATE TABLE foo ( id SERIAL NOT NULL PRIMARY KEY, bar text );
-- Insert row 1
INSERT INTO foo ( bar ) VALUES ( 'test' );
-- Reset the sequence
SELECT setval(pg_get_serial_sequence('foo', 'id'), 0, true);
-- Attempt to insert row 1 again
INSERT INTO foo ( bar ) VALUES ( 'test 2' )
ON CONFLICT (id) DO NOTHING;
स्पष्ट रूप से, यह नहीं जान सकता कि क्या अनुक्रम को बढ़ाए बिना कोई विरोध है, इसलिए "कुछ न करें" बाद आना होगा वह वेतन वृद्धि।