पोस्टग्रेज में UUID कॉलम के लिए डिफ़ॉल्ट मान


67

में Postgres 9.x, प्रकार का एक स्तंभ के लिए UUID, मैं कैसे एक UUID किसी भी पंक्ति के लिए एक डिफ़ॉल्ट मान सम्मिलित रूप में स्वचालित रूप से उत्पन्न होने के लिए निर्दिष्ट करूँ?

जवाबों:


92

tl; डॉ

OSSP uuid फ़ंक्शंस में से DEFAULTएक को बुलाने के लिए एक कॉलम को परिभाषित करते समय कॉल करें । पोस्टग्रैज सर्वर हर बार एक पंक्ति में सम्मिलित होने पर फ़ंक्शन को स्वचालित रूप से लागू करेगा।

CREATE TABLE tbl 
(
  pkey UUID NOT NULL DEFAULT uuid_generate_v1() , 
  CONSTRAINT pkey_tbl PRIMARY KEY ( pkey )
)

UUID उत्पन्न करने के लिए आवश्यक प्लगिन

जबकि Postgres आउट-ऑफ-द-बॉक्स का समर्थन करता है भंडारण UUID (वैश्विक अनुपम पहचानकर्ता) अपनी मूल में मान 128-बिट रूप है, पैदा UUID मूल्यों एक प्लग-इन की आवश्यकता है। Postgres में, प्लग-इन को a के रूप में जाना जाता है extension

एक्सटेंशन इंस्टॉल करने के लिए, कॉल करें CREATE EXTENSION। फिर से स्थापित करने से बचने के लिए, जोड़ें IF NOT EXISTS। देखें मेरे ब्लॉग पोस्ट अधिक जानकारी के लिए, या देखना StackOverflow में इस पेज

हम जो एक्सटेंशन चाहते हैं, वह एक ओपन-सोर्स लाइब्रेरी है, जो UUIDs, OSSP uuid के साथ काम करने के लिए C में निर्मित है । एक Postgres के लिए इस पुस्तकालय का निर्माण अक्सर इस तरह के रूप में Postgres की एक अधिष्ठापन के साथ आ जाते प्रदान की चित्रमय संस्थापक द्वारा एंटरप्राइज डीबी जैसे बादल प्रदाताओं द्वारा या शामिल PostgreSQL के लिए अमेज़न आरडीएस

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

UUID के विभिन्न प्रकार उत्पन्न करना

UUID मानों के विभिन्न प्रकारों को बनाने के लिए पेश किए गए कई आदेशों की एक सूची देखने के लिए एक्सटेंशन का दस्तावेज़ देखें। UUID के मूल संस्करण को कंप्यूटर के मैक एड्रेस के साथ-साथ वर्तमान तिथि-समय के साथ-साथ एक छोटे यादृच्छिक मान से प्राप्त करने के लिए कॉल करें uuid_generate_v1()

SELECT uuid_generate_v1();

672124b6-9894-11e5-be38-001d42e813fe

बाद में इस विषय पर विभिन्न प्रकार के UUIDs के प्रकार विकसित किए गए। कुछ लोग सर्वर के वास्तविक मैक पते को रिकॉर्ड नहीं करना चाहते हैं, उदाहरण के लिए, सुरक्षा या गोपनीयता चिंताओं के लिए। पोस्टग्रैज एक्सटेंशन UUID के पांच प्रकार उत्पन्न करता है, साथ ही "नील" UUID 00000000-0000-0000-0000-000000000000

डिफ़ॉल्ट मान के रूप में UUID

वह विधि कॉल किसी भी नई सम्मिलित पंक्ति के लिए डिफ़ॉल्ट मान उत्पन्न करने के लिए स्वचालित रूप से की जा सकती है। कॉलम को परिभाषित करते समय, निर्दिष्ट करें:

DEFAULT uuid_generate_v1()

निम्न उदाहरण तालिका परिभाषा में प्रयुक्त उस आदेश को देखें।

CREATE TABLE public.pet_
(
  species_ text NOT NULL,
  name_ text NOT NULL,
  date_of_birth_ text NOT NULL,
  uuid_ uuid NOT NULL DEFAULT uuid_generate_v1(),  -- <====
  CONSTRAINT pet_pkey_ PRIMARY KEY (uuid_)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.pet_
  OWNER TO postgres;

UUID संस्करण

UUID-ossp प्लगइन उत्पन्न कर सकते हैं UUID के विभिन्न संस्करणों

  • uuid_generate_v1()
    वर्तमान कंप्यूटर + वर्तमान क्षण का मैक पता शामिल है । सामान्य रूप से उपयोग किया जाता है, लेकिन यदि आप अपने डेटाबेस सर्वर के मैक का खुलासा करने या उस समय के बारे में संवेदनशील हैं, जब यह मान उत्पन्न हुआ था, तो बचें। संस्करण 1 UUID के रूप में विनिर्देशन द्वारा परिभाषित ।
  • uuid_generate_v1mc()
    संस्करण 1 की तरह , लेकिन असली मैक पते के बजाय एक यादृच्छिक मल्टीकास्ट मैक पते के साथ। यदि आप उस तथ्य का खुलासा करने के बारे में संवेदनशील हैं तो संस्करण 1 का उपयोग करने का एक तरीका है, लेकिन अपने डेटाबेस सर्वर के वास्तविक मैक के बजाय किसी अन्य मैक को प्रतिस्थापित करना।
    'रैंडम मल्टिकास्ट मैक' क्या है? मुझे ठीक से पता नहीं हैRFC 4122 के खंड 4.1.6 को पढ़ने के बाद , मुझे संदेह है कि यह मैक के स्थान पर उपयोग किया जाने वाला एक यादृच्छिक संख्या है, लेकिन बिट्स के साथ सामान्य यूनिकैस्ट के बजाय एक मल्टीकास्ट मैक पते को इंगित करने के लिए सेट किया गया है ताकि संस्करण 1 के इस भिन्नता को सामान्य से अलग किया जा सके। वास्तविक-मैक संस्करण 1 यूयूआईडी।
  • uuid_generate_v3( namespace uuid, name text )
    आपके द्वारा प्रदत्त पाठ का MD5 हैश समाहित करता है । संस्करण 3 UUID के रूप में विनिर्देशन द्वारा परिभाषित , नाम- आधारित UUID।
  • uuid_generate_v4()
    128 बिट के 121-122 के लिए यादृच्छिक रूप से उत्पन्न डेटा के आधार पर। छह और सात बिट्स संस्करण और वेरिएंट को इंगित करने के लिए उपयोग किए जाते हैं। इस तरह का यूयूआईडी केवल व्यावहारिक है अगर क्रिप्टोग्राफिक रूप से मजबूत यादृच्छिक जनरेटर के साथ लागू किया जाए । संस्करण 4 UUID के रूप में विनिर्देशन द्वारा परिभाषित ।
  • uuid_generate_v5( namespace uuid, name text )
    संस्करण 3 के समान लेकिन SHA1 हैशिंग का उपयोग करना । संस्करण 5 UUID के रूप में विनिर्देशन द्वारा परिभाषित ।
  • uuid_nil()
    एक विशेष मामला, सभी बिट्स शून्य पर सेट होते हैं 00000000-0000-0000-0000-000000000000। एक अज्ञात यूयूआईडी मूल्य के लिए एक ध्वज के रूप में उपयोग किया जाता है। एक नील UUID के रूप में जाना जाता है ।

प्रकारों की तुलना करने के लिए, प्रश्न देखें कि किस UUID संस्करण का उपयोग करना है?

यदि आप संस्करण 3 और 5 के बारे में उत्सुक हैं, तो यह प्रश्न देखें, v5 UUID उत्पन्न करना। नाम और नाम स्थान क्या है?

अधिक चर्चा के लिए, मेरे उत्तर को एक समान प्रश्न पर और मेरे ब्लॉग को UDID से JDBC से पोस्टग्रैज तक देखें


UUID प्रकार के कॉलम बनाने के लिए Google में 1,000,000 हिट्स। शून्य पंक्तियों के लिए हिट कि कैसे पं पंक्तियों द्वारा! : - @
क्लिंट ईस्टवुड

@ClintEastwood एक समान प्रश्न के लिए मेरा उत्तर और JDBC से पोस्टग्रेज के लिए मेरे ब्लॉग पोस्ट UUID मान आपकी मदद कर सकते हैं। यदि वे अपर्याप्त साबित होते हैं, तो एक नया प्रश्न पोस्ट करें। मुझे इस पर एक और छुरा लेने में खुशी होगी। मैं तुम्हारी हताशा को समझता हूं!
1930 में बेसिल बॉर्क

@ क्लिंटएस्टवुड: एक यूयूआईडी कॉलम की एक मान के साथ तुलना करने के लिए सिंटैक्स मैनुअल में प्रलेखित स्थिरांक के लिए सिंटैक्स का अनुसरण करता है: postgresql.org/docs/current/static/… और टाइप कास्ट: postesesql.org/docs/current/static/…
a_horse_with_no_name

1
@ बासिलबूर्क: यह वास्तव में आवश्यक नहीं है कि getObject()आप के परिणाम का भी उपयोग कर सकेंUUID id = rs.getObject("uuid_", UUID.class);
a_horse_with_no_name

1
@Rokit यादृच्छिक संख्या जनरेटर की ताकत को सत्यापित करने के लिए, अंतर्निहित ओपन-सोर्स कार्यान्वयन को देखें जो कि इस उत्तर एक्सटेंशन, OSSP uuid लाइब्रेरी प्रोजेक्ट द्वारा लिपटा हुआ है जैसा कि मेरे उत्तर में वर्णित है। और याद रखें, संस्करण 4 यूयूआईडी का उपयोग केवल अंतिम उपाय के रूप में किया जाना चाहिए, यदि किसी कारण से आप अन्य प्रकारों का चयन नहीं कर सकते हैं। आम तौर पर, आपकी पहली पसंद संस्करण 1 तरह की होनी चाहिए, uuid_generate_v1या तो कॉल करके uuid_generate_v1mc
बेसिल बॉर्क

7

pgcrypto एक्सटेंशन

बेसिल के बहुत विस्तृत उत्तर के लिए बस एक छोटा सा जोड़:

चूंकि वर्तमान में अधिकांश pgcrypto का उपयोग कर रहे हैं , uuid_generate_v1()आप के बजाय gen_random_uuid()एक संस्करण 4 UUID मान के लिए उपयोग कर सकते हैं ।

सबसे पहले, अपने Postgres में pgcrypto को सक्षम करें।

CREATE EXTENSION "pgcrypto";

बस एक कॉलम के DEFAULT को सेट करें DEFAULT gen_random_uuid()

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.