tl;डॉ
अब पोस्टग्रेस 10 में, पहचान के रूप में डिफ़ॉल्ट द्वारा उत्पन्न
निर्दिष्ट करें SQL मानक के अनुसार।
create table tower
(
npages integer,
ifnds integer,
ifnid integer,
name varchar(20),
towid integer GENERATED BY DEFAULT AS IDENTITY -- per SQL standard
)
पहचान कॉलम
Postgres 10 अब पहचान कॉलम की अवधारणा का समर्थन करता है , और मानक SQL सिंटैक्स का उपयोग करता है। जबकि मैं MS SQL सर्वर का कोई विशेषज्ञ नहीं हूँ, मेरा मानना है कि यह नया मानक समर्थन समकक्ष है।
जेनरेट किया गया ... पहचान के रूप में
जनरेट किया गया ... पहचान के रूप में
तालिका बनाएं
. के दौरान प्रयुक्त कमांड एक निहित अनुक्रम बनाता है। SERIAL
के विपरीत, उस क्रम का निर्माण, नामकरण, अनुमतियां और छोड़ना आपके लिए पारदर्शी है . अब बहुत सहज ज्ञान युक्त। यदि आप तालिका को उपयोग की अनुमति देते हैं, तो उन्हें अनुक्रम की अनुमति मिलती है। यदि आप तालिका छोड़ते हैं, तो अनुक्रम स्वचालित रूप से गिरा दिया जाता है।
मानक वाक्यविन्यास के दो स्वाद। अंतर केवल तभी मायने रखता है जब आप एक मूल्य उत्पन्न करने के बजाय एक मूल्य पारित करते हैं। आम तौर पर, लोग हमेशा जेनरेट किए गए मान पर भरोसा करते हैं, इसलिए आम तौर पर आप पहले संस्करण का उपयोग करेंगे, पहचान के रूप में डिफ़ॉल्ट द्वारा जेनरेट किया गया
।
पहचान के रूप में डिफ़ॉल्ट द्वारा उत्पन्न
- एक मान उत्पन्न करता है जब तक कि
INSERT
आदेश एक मूल्य प्रदान करता है।
- एक मान उत्पन्न करता है जब तक कि
हमेशा पहचान के रूप में उत्पन्न होता है
INSERT
द्वारा प्रदान किए गए किसी भी मान को अनदेखा करता है जब तकओवरराइडिंग सिस्टम वैल्यू
निर्दिष्ट न किया जाए
देखें तालिका बनाएं
दस्तावेज़ीकरण के लिए पृष्ठ।
पढ़ें यह दिलचस्प पेज
पीटर एसेंट्रौट द्वारा। वे SERIAL
. के साथ कुछ अजीब मुद्दों के बारे में बताते हैं . नई पहचान कॉलम सुविधा के साथ ऐसी कोई समस्या नहीं है। इसलिए SERIAL
. का उपयोग करने का कोई कारण नहीं है अब और नहीं, कोई डाउनसाइड नहीं, केवल अपसाइड; सीरियल
GENERATED … AS IDENTITY
. द्वारा प्रतिस्थापित किया जाता है .
ध्यान दें कि एक पहचान कॉलम जरूरी प्राथमिक कुंजी नहीं है, और स्वचालित रूप से अनुक्रमित नहीं होता है। तो आपको अभी भी प्राथमिक कुंजी
निर्दिष्ट करने की आवश्यकता है स्पष्ट रूप से यदि यह आपका इरादा है (जैसा कि आमतौर पर होता है)।
CREATE TABLE person_ (
id_
INTEGER
GENERATED BY DEFAULT AS IDENTITY -- Replaces SERIAL. Implicitly creates a SEQUENCE, specified as DEFAULT.
PRIMARY KEY -- Creates index. Specifies UNIQUE. Marks column for relationships.
,
name_
VARCHAR( 80 )
) ;
इरादा आंतरिक कार्यान्वयन विवरण आपसे छिपाए जाने का है। आपको कवर के नीचे उत्पन्न होने वाले अनुक्रम का नाम जानने की आवश्यकता नहीं है। उदाहरण के लिए, आप अंतर्निहित अनुक्रम को जाने बिना कॉलम के माध्यम से काउंटर को रीसेट कर सकते हैं।
ALTER TABLE person_
ALTER COLUMN id_
RESTART WITH 1000 -- Reset sequence implicitly, without a name.
;
परोक्ष रूप से पहचान निर्दिष्ट करना:
- चिह्नित स्तंभ
शून्य नहीं
- एक क्रम बनाता है
- अनुक्रम का प्रकार कॉलम से मेल खाता है (32-बिट 64-बिट आदि)
- अनुक्रम को कॉलम से जोड़ता है
- अनुमति प्राप्त करता है
- कैस्केड गिर रहा है
- कॉलम का नाम बदलने पर भी कॉलम से जुड़ा रहता है
- अनुक्रम को उस कॉलम के डिफ़ॉल्ट मानों के स्रोत के रूप में निर्दिष्ट करता है
पहचान कॉलम CREATE SEQUENCE<के समान विकल्प ले सकता है /कोड>
:
शुरू से शुरू करें
MINVALUE minvalue
|कोई MINVALUE नहीं
MAXVALUE अधिकतम मान
|कोई MAXVALUE नहीं
इन्क्रीमेंट [ BY ] इंक्रीमेंट
चक्र
|कोई चक्र नहीं
कैश
कैशेकिसी के स्वामित्व में नहीं
(पहचान कॉलम के लिए स्वामित्व निर्दिष्ट करना मेरे लिए कोई मायने नहीं रखता क्योंकि स्वामित्व स्वचालित रूप से प्रबंधित होता है)
विकल्पों का मूर्खतापूर्ण उदाहरण:
id_ INTEGER
GENERATED BY DEFAULT AS IDENTITY (
START WITH 200
MINVALUE 100
MAXVALUE 205
CYCLE
INCREMENT BY 3
) PRIMARY KEY
4 पंक्तियाँ जोड़ना: