2011-08-04 12 views
10
select uuid_generate_v4() as one, uuid_generate_v4() as two; 

"एक" UUID और "दो" UUID बराबर कर रहे हैं!PostgreSQL UUID पीढ़ी

CREATE TABLE "TB" 
(
    "Id" uuid NOT NULL DEFAULT uuid_generate_v4(), 
    "Title" character varying NOT NULL, 
    CONSTRAINT "TB_Class_ID" PRIMARY KEY ("Id") 
); 

PostgreSQL 9.0 pgAdmin 1.12.3

insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111'); 
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111'); 
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111'); 

या

insert into "TB" ("Title") values ('111'); 
insert into "TB" ("Title") values ('111'); 
insert into "TB" ("Title") values ('111'); 

परिणाम:

ERROR: duplicate key value violates unique constraint "TB_Class_ID" 
DETAIL: Key ("Id")=(12ab6634-995a-4688-9a9a-ee8c3fe24395) already exists. 

जबकि

postgreSQL maestro 9.2.0.4

insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111'); 
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111'); 
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111'); 

परिणाम: 1 पंक्तियां प्रभावित हुईं;

मैं समझता हूं कि मेस्ट्रो ने एक-एक करके रिकॉर्ड जोड़े हैं, लेकिन क्यों uuid_generate_v4() दो कॉल के बाद समान मान देता है? (पीजीएडमिन मामले में)।

और मैं एक अनुरोध से कई पंक्तियों को कैसे जोड़ सकता हूं?

+0

यह मेरे लिए एक बग जैसा दिखता है। 'यादृच्छिक() को एक के रूप में याद रखें, यादृच्छिक() दो के रूप में;'। मुझे दो अलग-अलग मूल्य मिलते हैं, भले ही मैं लेनदेन में हूं या नहीं। 'uuid_generate_v4' एक 'वोल्टाइल' फ़ंक्शन है, इसलिए मुझे लगता है कि गलती यूयूआईडी-ओएसपीपी मॉड्यूल या अंतर्निहित लाइब्रेरी में है। –

+1

हां "यादृच्छिक() के रूप में याद रखें, यादृच्छिक() एएस दो" अलग-अलग मान प्राप्त करें और मुझे समझ में नहीं आता कि क्यों uuid_generate_v4 बराबर मान प्राप्त करते हैं –

उत्तर

11

किसी दिए गए लेनदेन के भीतर, फ़ंक्शन uuid_generate_v4() समान मान देता है।

जब कथन को एक साथ समूहीकृत किया जाता है और "एक आदेश" के रूप में चलाया जाता है, तो एक लेनदेन होता है, इसलिए uuid_generate_v4() पर प्रत्येक कॉल एक ही मान वापस कर देगा।

दो तरीके करने के लिए "ठीक" इस प्रकार हैं:

  1. अलग डाटाबेस हर बार जब आप फ़ंक्शन का उपयोग करें (यह सबसे आसान है)
  2. उपयोग एक गैर ऑटो कनेक्शन के लिए प्रतिबद्ध है जहाँ आप लेन-देन को नियंत्रित कॉल करें और एक BEGIN; COMMIT जोड़ी के भीतर प्रत्येक उपयोग अलग है (यह एक परेशानी है - जब तक आप के लिए है ऐसा नहीं करते हैं)
+0

बहुत धन्यवाद बोहेमियन –

+4

Google से यहां आने वाले सभी लोगों के लिए बस FYI या जो भी हो, लेकिन मैं ऐसा नहीं लगता कि यह एक बग या मुद्दा है। "uuid_generate_v4() को एक के रूप में चुनें, uuid_generate_v4() दो के रूप में" मेरे PostgreSQL 9.3/9.4 इंस्टॉल में ठीक से काम करता है। @ पीटर-इइसेंट्राउट की तरह, यह शायद एक बग था जिसे थोड़ी देर पहले तय किया गया था। –

0
begin ISOLATION LEVEL READ UNCOMMITTED; 
insert into "TB" ("Title") values ('111'); 
insert into "TB" ("Title") values ('111'); 
insert into "TB" ("Title") values ('111'); 
commit; 

यह भी संभव है

13

अतीत में किसी बिंदु पर, uuid_generate_* कार्यों को ग़लत ढंग से IMMUTABLE के रूप में चिह्नित किया गया था, जिसके परिणामस्वरूप आप दिखाए गए व्यवहार में परिणाम होंगे। यह सभी नवीनतम मामूली संस्करणों में तय किया गया है, लेकिन आपको अद्यतन फ़ंक्शन परिभाषाएं प्राप्त करने के लिए इंस्टॉलेशन स्क्रिप्ट (uuid-ossp.sql) को फिर से चलाने की आवश्यकता है। (आप यह सत्यापित करने के लिए इंस्टॉलेशन स्क्रिप्ट में भी देख सकते हैं कि आपके पास एक अद्यतित संस्करण है। फ़ंक्शंस को VOLATILE चिह्नित किया जाना चाहिए।)

+1

मैं 'UUID-ossp.sql' में वाष्पशील के लिए IMMUTABLE प्रतिस्थापित '() का चयन uuid_generate_v1 एक के रूप में, uuid_generate_v4() के रूप में two' देता है दो अलग-अलग परिणाम लेकिन '" टीबी "(" ईद "में डालने, "शीर्षक") मान (uuid_generate_v4(), '111'); "टीबी" ("आईडी", "शीर्षक") मानों में डालें (uuid_generate_v4(), '111'); ' " डुप्लिकेट कुंजी "त्रुटि जारी रखता है –

+1

आपके द्वारा ऊपर दिखाए गए तालिका परिभाषा में एक अनूठी बाधा भी नहीं है, इसलिए आप हमें पूर्ण सत्य नहीं बता रहे हैं। –

+0

मुझे खेद है, 'कन्स्ट्रेंट "अपडेट किया गया पोस्ट करें TB_Class_ID" प्राथमिक कुंजी ("आईडी") ' –