2012-04-11 9 views
21

मैं इस तरह तालिका बनाने रहा हूँ के लिए मूल्य उत्पन्न करने के लिए है:वहाँ SQLite में यूआईडी डेटाप्रकार यदि हाँ तो कैसे कि

CREATE TABLE foobar (id uniqueidentifier, foo text, bar text, PRIMARY KEY (id)) 

कैसे डालें या तालिका foobar में आईडी क्षेत्र के लिए मूल्य उत्पन्न करने के लिए?

उत्तर

49

आप तर्क दे सकते हैं कि SQLite डेटा प्रकार का समर्थन नहीं करता है। SQLite3 में, उदाहरण के लिए, आप यह कर सकते हैं।

sqlite> create table test (id wibblewibble primary key); 

SQLite खुशी से "डेटा प्रकार" wibblewibble के साथ एक स्तंभ बना देगा। SQLite खुशी से "डेटा प्रकार" uuid, guid, और SuperChicken के साथ कॉलम भी बनाएगा।

आपके लिए महत्वपूर्ण बिंदु शायद स्वचालित रूप से यूआईडी उत्पन्न करने का तरीका है। SQLite आपको बहुत मदद नहीं कर सकता है।

आप इसे पूरी तरह से क्लाइंट प्रोग्राम तक छोड़ सकते हैं। यदि आप अजगर में प्रोग्रामिंग कर रहे हैं, तो uuid module का उपयोग करें। रूबी में, आपके पास SecureRandom.uuid function है। अन्य भाषाओं में समान सुविधाएं या कामकाज होते हैं।

आप सी में अपना खुद का यूआईडी-जनरेटिंग फ़ंक्शन लिख सकते हैं (Create or Redefine SQL Functions देखें।) मैं इसे अपेक्षाकृत चरम दृष्टिकोण कहूंगा।

आप इसे binary या text प्रारूप में संग्रहीत कर सकते हैं।


अन्य बातचीत ऑनलाइन सुझाव है कि क्या एक UUID है के बारे में एक व्यापक गलतफहमी यह है कि। एक यूयूआईडी केवल 128-बिट यादृच्छिक संख्या नहीं है। एक यूयूआईडी संरचना और नियम है। RFC 4122 देखें।

+1

आपकी मदद के लिए धन्यवाद। मैंने एंड्रॉइड एप्लिकेशन के लिए यूआरआईडी उत्पन्न की है जैसे इस स्ट्रिंग sUUiDValue = UUID.randomUUID()। ToString(); और फिर तालिका में डाला गया ... – amy

3

एक परियोजना — यह विकृत UUIDs — पैदा करता है लेकिन यह एक दिलचस्प तकनीक एक subselect का उपयोग कर तो उस से चयन सबस्ट्रिंग अनियमितता उत्पन्न करने के लिए पता चलता

select SUBSTR(UUID, 0, 8)||'-'||SUBSTR(UUID,8,4)||'-'||SUBSTR(UUID,12,4)||'-'||SUBSTR(UUID,16) 
from (
select lower(hex(randomblob(16))) AS UUID 
); 
+3

दुर्भाग्यवश, यह विकृत यूयूआईडी उत्पन्न करता है, उदाहरण के लिए: 284e630-2293-bea6-21b1095ac11fe4f04। इसमें पहले समूह में 8 वर्ण, 4 का तीसरा समूह और आखिरी बार 12 वर्ण होना चाहिए। इसके अलावा, यूयूआईडी संस्करण बिट्स 4 होना चाहिए, यादृच्छिक नहीं। –

15

बेंजामिन बेरी के जवाब सही नहीं है के लिए इस की जरूरत है। यहाँ कुछ इसी तरह की है कि मैं इस बात की पुष्टि कर दिया है करता है काम:

select substr(u,1,8)||'-'||substr(u,9,4)||'-4'||substr(u,13,3)|| 
    '-'||v||substr(u,17,3)||'-'||substr(u,21,12) from (
    select lower(hex(randomblob(16))) as u, substr('89ab',abs(random()) % 4 + 1, 1) as v); 

कुछ नमूना उत्पादन: के लिए

lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6))) 

:

c71122df-18e4-4a78-a446-fbf7b8f2969b 
61e75f87-978b-4d9e-b587-bedcc2d23898 
30eee0fa-2ff2-4ff5-b8ef-f99378272999 
+1

मेरे लिए यह मेरी माइग्रेशन प्रतिलिपि के लिए एक टेबल से दूसरे में एक ही सटीक यूयूड्स बनाया गया है (जहां मैंने int से इस यूआईडी में _id बदल दिया है) – miroslavign

+1

जैसा कि @miroslavign के समान है, उदाहरण के लिए सभी टेबल रिकॉर्ड्स अपडेट करने के लिए एक अनुरोध के भीतर उपयोग किया जाता है, जेनरेट करता है वही यूयूआईडी foreach रिकॉर्ड सटीक। – fharreau

5

यहाँ कुछ इसी तरह जो सीधे एक अभिव्यक्ति के रूप में इस्तेमाल किया जा सकता है कॉलम के लिए डिफ़ॉल्ट मान के रूप में पारित करने के लिए उदाहरण:

sqlite> create table "table" (
    "id" char(36) default (lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6)))), 
    "data" varchar(255), primary key ("id") 
); 

sqlite> insert into "table" ("data") values ('foo'); 
sqlite> insert into "table" ("data") values ('bar'); 
sqlite> select * from "table"; 
947efcc9-4212-442a-b68c-eb6fbd8a7128|foo 
a2c3857b-1eb4-40bd-aed2-6e8d68cc2ab8|bar 
संबंधित मुद्दे