मौजूदा डेटा के लिए MySQL में GUID उत्पन्न करें?


101

मैंने अभी एक MySQL तालिका में डेटा का एक गुच्छा आयात किया है और मेरे पास एक कॉलम "GUID" है जिसे मैं मूल रूप से नए और अद्वितीय यादृच्छिक GUID के साथ सभी मौजूदा पंक्तियों को भरना चाहता हूं।

मैं इसे MySQL में कैसे करूँ?

मैंने कोशिश की

UPDATE db.tablename
  SET columnID = UUID()
  where columnID is not null

और हर क्षेत्र को एक समान प्राप्त करें


2
क्या आप वास्तव में निश्चित हैं, वे समान हैं? मैंने कोशिश की है, अधिकांश पात्र समान हैं, लेकिन उत्पन्न uuid में कुछ अंतर हैं
xiaoyifang

हां, मैं पुष्टि करता हूं, यह वही है!
सिरिल एन।

यह मेरे लिए काम करता है - मतभेद मामूली हैं, लेकिन वहाँ हैं। चेक करने के लिए सबसे तेज़ तरीका कॉलम में एक UNIQUE बाधा जोड़ना है।
पीएसयू

जवाबों:


88

मुझे यकीन नहीं है कि यह सबसे आसान तरीका है, लेकिन यह काम करता है। विचार एक ट्रिगर बनाने का है जो आपके लिए सभी काम करता है, फिर, एक क्वेरी निष्पादित करने के लिए जो आपकी तालिका को अपडेट करता है, और अंत में इस पैक को छोड़ने के लिए:

delimiter //
create trigger beforeYourTableUpdate  BEFORE UPDATE on YourTable
FOR EACH ROW
BEGIN
  SET new.guid_column := (SELECT UUID());
END
//

फिर अमल करें

UPDATE YourTable set guid_column = (SELECT UUID());

और DROP TRIGGER beforeYourTableUpdate;

अद्यतन एक और समाधान जो ट्रिगर्स का उपयोग नहीं करता है, लेकिन प्राथमिक कुंजी या अद्वितीय सूचकांक की आवश्यकता होती है:

UPDATE YourTable,
INNER JOIN (SELECT unique_col, UUID() as new_id FROM YourTable) new_data 
ON (new_data.unique_col = YourTable.unique_col)
SET guid_column = new_data.new_id

एक बार फिर अद्यतन करें: ऐसा लगता है कि आपकी मूल क्वेरी भी काम करनी चाहिए (हो सकता है कि आपको आवश्यकता न हो WHERE columnID is not null, इसलिए मेरे सभी फैंसी कोड की आवश्यकता नहीं है।


हाँ, यह 5.0 में भी काम करना चाहिए। लेकिन ट्रिगर छोड़ना मत भूलना!
a1ex07

हाँ, निश्चित रूप से :) सोच रहा था कि क्या मुझे इसके बाद डुप्लिकेट के लिए जांच करने की आवश्यकता है या क्या यह कॉलम में प्रत्येक पंक्ति के लिए अद्वितीय मान पैदा करेगा?
टॉम

यदि UUIDइसे ठीक से लागू किया गया है (और मेरा मानना ​​है कि यह है), तो आपको डुप्लिकेट की जांच किए बिना अद्वितीय सूचकांक बनाने में सक्षम होना चाहिए।
a1ex07

मैंने अपने उत्तर को एक और दृष्टिकोण के साथ अद्यतन किया जो उपयोगी भी हो सकता है।
1ex07

2
आपका मूल कोड काम करेगा, बस columnId = UUID () को columnId = (SELECT UUID ()) बदलें। मेरे लिए बहुत अच्छा काम किया। सभी उत्पन्न मूल्य समान होने के बहुत करीब हैं, लेकिन प्रत्येक अद्वितीय है।
ईजै

113

मुझे एक मौजूदा तालिका में एक गाइड प्राथमिक कुंजी कॉलम जोड़ने और इसे अद्वितीय GUID के साथ पॉप्युलेट करने की आवश्यकता थी और इस आंतरिक क्वेरी के साथ इस अपडेट क्वेरी ने मेरे लिए काम किया:

UPDATE sri_issued_quiz SET quiz_id=(SELECT uuid());

बहुत आसन :-)


35
पहले मुझे लगा कि इसने डुप्लिकेट यूयूआईडी डाले थे क्योंकि वे सभी एक ही शुरू करते हैं और समाप्त होते हैं, लेकिन वे वास्तव में थोड़ा अलग हैं।
सैम बार्नम

3
@SamBarnum क्योंकि मशीन और टाइमस्टैम्प केUUID आधार पर उत्पन्न होता है । एक क्वेरी के रूप में जिसे चलाने के लिए मिलीसेकंड का समय लगता है, उन्हें वास्तव में बहुत करीब होना चाहिए ... लेकिन कभी भी समान नहीं ... आपको आश्वस्त करने के लिए एक अच्छी बात है, उस कॉलम में एक इंडेक्स जोड़ना । UNIQUE
9

2
स्वीकृत उत्तर इससे तुलना करने वाला ओवरकिल लगता है!
Xtreme बाइकर

4
कम से कम मरियादब (10.1.26) में यह काम नहीं लगता है, जो हर रिकॉर्ड के लिए समान है।
जोहनवड

4
यह मेरे लिए हर रिकॉर्ड पर समान यूयूआईडी उत्पन्न करता है, संभवतः क्योंकि यह एक उपश्रेणी में है और MySQL सबसे पहले आंतरिक क्वेरी को निष्पादित करेगा और सभी पंक्तियों के लिए समान मूल्य का उपयोग करेगा। इसे हल करने के लिए, उपकुंजी को हटा दें:UPDATE sri_issued_quiz SET quiz_id=uuid();
क्रिस व्हाइट

22

अनुमोदित समाधान अद्वितीय आईडी बनाता है, लेकिन पहली नज़र में वे समान दिखते हैं, केवल पहले कुछ अक्षर भिन्न होते हैं।

यदि आप अलग-अलग कुंजी चाहते हैं, तो यह प्रयास करें:

update CityPopCountry set id = (select md5(UUID()));


MySQL [imran@lenovo] {world}> select city, id from CityPopCountry limit 10;
+------------------------+----------------------------------+
| city                   | id                               |
+------------------------+----------------------------------+
| A Coruña (La Coruña)   | c9f294a986a1a14f0fe68467769feec7 |
| Aachen                 | d6172223a472bdc5f25871427ba64e46 |
| Aalborg                | 8d11bc300f203eb9cb7da7cb9204aa8f |
| Aba                    | 98aeeec8aa81a4064113764864114a99 |
| Abadan                 | 7aafe6bfe44b338f99021cbd24096302 |
| Abaetetuba             | 9dd331c21b983c3a68d00ef6e5852bb5 |
| Abakan                 | e2206290ce91574bc26d0443ef50fc05 |
| Abbotsford             | 50ca17be25d1d5c2ac6760e179b7fd15 |
| Abeokuta               | ab026fa6238e2ab7ee0d76a1351f116f |
| Aberdeen               | d85eef763393862e5fe318ca652eb16d |
+------------------------+----------------------------------+

मैं MySQL सर्वर संस्करण का उपयोग कर रहा हूं: 5.5.40-0 + wheezy1 (डेबियन)


6
मेरे मामले में, मुझे उत्पन्न GUID में हाइफ़न की आवश्यकता थी। मैंने इसका उपयोग किया: SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')क्वेरी बहुत सुंदर नहीं है, लेकिन यह काम करता है।
सोल

9
UUID की तुलना में md5 कम अद्वितीय नहीं है? मुझे टकराव की चिंता होगी।
एडम


5

जब मैं उत्पन्न हुआ तो UUIDs को संशोधित करने का प्रयास करते समय एक मामूली परिणाम के रूप में मैं एक अजीब परिणाम के साथ समाप्त हो गया। मैंने पाया जवाब से राकेश , सरल है कि अच्छी तरह से काम हो ऐसे मामलों में जहां आप डैश उन्हें हटाना चाहते को छोड़कर के लिए।

सन्दर्भ के लिए:

UPDATE some_table SET some_field=(SELECT uuid());

इसने अपने आप पूरी तरह से काम किया। लेकिन जब मैंने यह कोशिश की:

UPDATE some_table SET some_field=(REPLACE((SELECT uuid()), '-', ''));

तब सभी परिणामी मान समान थे (सूक्ष्म रूप से भिन्न नहीं - मैंने एक GROUP BY some_fieldप्रश्न के साथ जांच की चौगुनी )। इससे कोई फर्क नहीं पड़ता कि मैं कोष्ठक कैसे स्थित हूं, वही बात होती है।

UPDATE some_table SET some_field=(REPLACE(SELECT uuid(), '-', ''));

ऐसा लगता है कि जब आसपास के क्षेत्र में REPLACE के साथ एक UUID उत्पन्न होता है, तो यह केवल UUID क्वेरी को एक बार चलाता है, जो संभवतः I की तुलना में बहुत अधिक समझदार डेवलपर्स के लिए एक अनुकूलन के रूप में सही समझ में आता है, लेकिन यह मेरे लिए नहीं था।

इसे हल करने के लिए, मैंने इसे दो प्रश्नों में विभाजित किया है:

UPDATE some_table SET some_field=(SELECT uuid());
UPDATE some_table SET some_field=REPLACE(some_field, '-', '');

सरल समाधान, स्पष्ट रूप से, लेकिन उम्मीद है कि यह किसी ऐसे समय को बचाएगा जो मैंने अभी खो दिया है।


4

एक साधारण टाइपो लगता है। आप मतलब नहीं था "... जहां columnId है अशक्त"?

UPDATE db.tablename
  SET columnID = UUID()
  where columnID is null

1
जब मैंने प्रश्न पढ़ा तो मुझे भी ऐसा ही लगा था, लेकिन मुझे ऐसा नहीं लगता: लगता है कि उनके कॉलम में मान हैं, लेकिन अद्वितीय मान नहीं हैं। आपके उत्तर से बहुत पहले दिए गए उत्तर पहले ही दिखा देते हैं कि क्या आवश्यक है। एक WHEREखंड नहीं होना चाहिए । और उत्पन्न मूल्य बहुत समान हैं, इसलिए उन्हें यह देखने के लिए बारीकी से देखना चाहिए कि वे वास्तव में अलग हैं।
टूलमेकरसेव

3

मैंने ज्यादातर एक ही मुद्दे का सामना किया। Im मेरा मामला uuid BINARY (16) के रूप में संग्रहीत है और इसमें पूरी तरह से कोई बाधा नहीं है। और मुझे इस मुद्दे का सामना करना पड़ा जब हर पंक्ति के लिए एक ही यूयूआईडी तैयार किया गया था, और UNIQUE की बाधा इसकी अनुमति नहीं देती है। तो यह क्वेरी काम नहीं करती है:

UNHEX(REPLACE(uuid(), '-', ''))

लेकिन मेरे लिए यह काम कर गया, जब मैंने नेस्टेड इनर सेलेक्ट के साथ ऐसी क्वेरी का इस्तेमाल किया:

UNHEX(REPLACE((SELECT uuid()), '-', ''))

फिर हर प्रविष्टि के लिए अद्वितीय परिणाम तैयार किया जाता है।


1
UPDATE db.tablename SET columnID = (SELECT UUID()) where columnID is not null

2
कृपया अपने कोड के काम करने के तरीके पर कुछ स्पष्टीकरण जोड़ें। अन्य एसओ उपयोगकर्ताओं को समझने के लिए टिप्पणियों के बिना कोड हमेशा आसान नहीं होता है
सिमस जोनलियुनस

अगर आप मौजूदा डेटा में uid को अपडेट करना चाहते हैं, तो अपनी स्थिति के अनुसार क्वेरी चलाएं।
आशुतोष निरंजन

0

MYsql अपडेट टैबलेन सेट कॉलम का नाम = UUID ()

oracle UPDATE tablename SET columnName = SYS_GUID ();

SQLSVER UPDATE tablename SET columnName = NEWID () ;;


0
// UID Format: 30B9BE365FF011EA8F4C125FC56F0F50
UPDATE `events` SET `evt_uid` = (SELECT UPPER(REPLACE(@i:=UUID(),'-','')));

// UID Format: c915ec5a-5ff0-11ea-8f4c-125fc56f0f50
UPDATE `events` SET `evt_uid` = (SELECT UUID());

// UID Format: C915EC5a-5FF0-11EA-8F4C-125FC56F0F50
UPDATE `events` SET `evt_uid` = (SELECT UPPER(@i:=UUID()));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.