serial
ऑटो-जेनरेट किए गए अद्वितीय मूल्यों का "पुराना" कार्यान्वयन है जो युगों से पोस्टग्रेज का हिस्सा रहा है। हालाँकि यह SQL मानक का हिस्सा नहीं है।
SQL मानक के साथ अधिक अनुपालन करने के लिए, Postgres 10 ने generated as identity
का उपयोग करके सिंटैक्स की शुरुआत की .
अंतर्निहित कार्यान्वयन अभी भी एक अनुक्रम पर आधारित है, परिभाषा अब SQL मानक का अनुपालन करती है। एक चीज जो इस नए सिंटैक्स की अनुमति देती है वह है मूल्य के आकस्मिक ओवरराइड को रोकना।
निम्नलिखित तालिकाओं पर विचार करें:
create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);
अब जब आप दौड़ें:
insert into t1 (id) values (1);
तालिका में अंतर्निहित अनुक्रम और मान अब समन्वयित नहीं हैं। अगर आप दूसरा चलाते हैं
insert into t1 default_values;
आपको एक त्रुटि मिलेगी क्योंकि अनुक्रम पहले डालने से उन्नत नहीं था, और अब 1
मान डालने का प्रयास करता है दोबारा।
हालांकि दूसरी तालिका के साथ,
insert into t2 (id) values (1);
इसमें परिणाम:
ERROR: cannot insert into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS.
तो आप गलती से अनुक्रम उपयोग को "भूल" सकते हैं। override system value
. का उपयोग करके आप अभी भी इसे बाध्य कर सकते हैं विकल्प:
insert into t2 (id) overriding system value values (1);
जो आपको अभी भी एक अनुक्रम के साथ छोड़ देता है जो तालिका में मूल्यों के साथ सिंक से बाहर है, लेकिन कम से कम आपको इसके बारे में अवगत कराया गया था।
धारावाहिक के बजाय नए पहचान सिंटैक्स का उपयोग करने की अनुशंसा की जाती है