पोस्टग्रेज MySQL की तुलना में ऑटो इंक्रीमेंट को थोड़ा अलग तरीके से हैंडल करता है। Postgres में, जब आप serial
. बनाते हैं फ़ील्ड, आप एक अनुक्रम फ़ील्ड भी बना रहे हैं जो उपयोग करने के लिए आईडी का ट्रैक रख रहा है। यह अनुक्रम फ़ील्ड 1 के मान के साथ प्रारंभ होने जा रहा है।
जब आप तालिका में कोई नया रिकॉर्ड सम्मिलित करते हैं, यदि आप id
. निर्दिष्ट नहीं करते हैं फ़ील्ड, यह अनुक्रम के मान का उपयोग करेगा, और फिर अनुक्रम को बढ़ाएगा। हालांकि, यदि आप id
. निर्दिष्ट करते हैं फ़ील्ड, फिर अनुक्रम का उपयोग नहीं किया जाता है, और इसे अपडेट भी नहीं किया जाता है।
मैं यह मान रहा हूं कि जब आप पोस्टग्रेज में चले गए, तो आपने कुछ मौजूदा उपयोगकर्ताओं को उनकी मौजूदा आईडी के साथ सीड या आयात किया। जब आपने इन उपयोगकर्ता रिकॉर्ड को उनकी आईडी के साथ बनाया था, तो अनुक्रम का उपयोग नहीं किया गया था, और इसलिए इसे कभी भी अपडेट नहीं किया गया था।
इसलिए, यदि, उदाहरण के लिए, आपने 10 उपयोगकर्ताओं को आयात किया है, तो आपके पास 1-10 आईडी वाले उपयोगकर्ता हैं, लेकिन आपका क्रम अभी भी 1 पर है। जब आप आईडी निर्दिष्ट किए बिना एक नया उपयोगकर्ता बनाने का प्रयास करते हैं, तो यह अनुक्रम से मान खींचता है ( 1), और आपको एक अद्वितीय उल्लंघन मिलता है क्योंकि आपके पास पहले से आईडी 1 वाला उपयोगकर्ता है।
समस्या का समाधान करने के लिए, आपको अपना users_id_seq
. सेट करना होगा आपके मौजूदा उपयोगकर्ताओं के MAX(id) के लिए अनुक्रम मान. अनुक्रम को रीसेट करने के बारे में अधिक जानकारी के लिए आप इस प्रश्न/उत्तर को पढ़ सकते हैं, लेकिन आप कुछ ऐसा भी कर सकते हैं (अनचाहे):
SELECT setval(pg_get_serial_sequence('users', 'id'), coalesce(max(id)+1, 1), false) FROM users;
FYI करें, यह MySQL में कोई समस्या नहीं है क्योंकि MySQL स्वचालित रूप से ऑटो इंक्रीमेंट अनुक्रम को सबसे बड़े कॉलम मान में अपडेट करता है जब कोई मान मैन्युअल रूप से ऑटो इंक्रीमेंटिंग फ़ील्ड में डाला जाता है।