বিদ্যমান ডেটা জন্য মাইএসকিউএল এ জিইউইডি উত্পাদন?


103

আমি সবেমাত্র একটি মাইএসকিউএল টেবিলটিতে একটি গুচ্ছ ডেটা আমদানি করেছি এবং আমার একটি কলাম "জিইউডি" রয়েছে যা আমি মূলত নতুন এবং অনন্য এলোমেলো জিইউইডি'র সাথে বিদ্যমান সমস্ত সারিগুলি পূরণ করতে চাই।

আমি মাইএসকিউএল এ কিভাবে করব?

আমি চেষ্টা করেছিলাম

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

এবং কেবল প্রতিটি ক্ষেত্রকে একই করুন


4
আপনি কি সত্যই নিশ্চিত,
এগুলিও

হ্যাঁ, আমি নিশ্চিত, এটি একই!
সাইরিল এন।

এটি আমার পক্ষে কাজ করে - পার্থক্যগুলি সামান্য, তবে রয়েছে। চেক করার দ্রুততম উপায় হ'ল কলামটিতে একটি অনন্য বাধা যুক্ত করা।
পিএসইউ

উত্তর:


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

আমি আমার উত্তরটি অন্য পদ্ধতির সাথে আপডেট করেছি যা কার্যকরও হতে পারে।
a1ex07

4
আপনার আসল কোডটি কাজ করবে, কেবল কলামিড = ইউইউডি () কলামিড = (সিলেক্ট ইউইউইডি ()) করুন। আমার জন্য দুর্দান্ত কাজ করেছেন সমস্ত উত্পন্ন মানগুলি একই হওয়ার খুব কাছাকাছি তবে প্রতিটি অনন্য।
ইজে 21

116

আমার বিদ্যমান টেবিলটিতে একটি গাইড প্রাথমিক কী কলামটি যুক্ত করার দরকার ছিল এবং এটি অনন্য জিইউইডি দিয়ে তৈরি করা উচিত এবং অভ্যন্তরীণ নির্বাচনের সাথে এই আপডেটের ক্যোয়ারীটি আমার জন্য কাজ করেছিল:

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

খুবই সোজা :-)


36
প্রথমে আমি ভেবেছিলাম এটিতে সদৃশ ইউআইডিগুলি hadোকানো হয়েছে কারণ এগুলি সমস্তই শুরু এবং শেষ হয় তবে বাস্তবে তারা কিছুটা আলাদা।
স্যাম বার্নুম

4
@ সামবার্নম কারণ মেশিন এবং টাইমস্ট্যাম্পেরUUID ভিত্তিতে তৈরি করা হয়েছে । দেরি করতে মিলিসেকেন্ডগুলি লাগে এমন একটি ক্যোয়ারী হিসাবে তাদের অবশ্যই খুব কাছাকাছি থাকতে হবে ... তবে কখনও একই নয় ... আপনাকে আশ্বস্ত করার জন্য ভাল জিনিসটি হ'ল সেই কলামটিতে একটি সূচি যুক্ত করা। UNIQUE
বেলেক্সান্দ্রে

4
গৃহীত উত্তর এটির সাথে তুলনা করে একটি ওভারকিল বলে মনে হচ্ছে!
এক্সট্রিম বাইকার

4
কমপক্ষে মারিয়্যাডবিতে (10.1.26) এটি কাজ করছে বলে মনে হয় না, প্রতিটি রেকর্ডের জন্য একই uuid প্রদান করে।
johanvdw

5
এটি আমার জন্য প্রতিটি রেকর্ডে একই ইউআইডি উত্পন্ন করেছিল, সম্ভবতঃ এটি একটি সাবকিউরিতে রয়েছে এবং মাইএসকিউএল প্রথমে অভ্যন্তরীণ কোয়েরিটি কার্যকর করবে এবং সমস্ত সারিগুলির জন্য একই মান ব্যবহার করবে। এটি সমাধানের জন্য, সাবকোয়ারিটি সরিয়ে ফেলুন: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 |
+------------------------+----------------------------------+

আমি মাইএসকিউএল সার্ভার সংস্করণ ব্যবহার করছি: 5.5.40-0 + হুইজি 1 (দেবিয়ান)


6
আমার ক্ষেত্রে, উত্পাদিত জিইউডিতে আমার হাইফেনের দরকার ছিল। আমি এটি ব্যবহার করেছি: SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')ক্যোয়ারী খুব সুন্দর নয় তবে এটি কাজটি করে।
একক

9
এমডি 5 কি ইউইউডি থেকে কম অনন্য নয়? আমি সংঘর্ষের বিষয়ে চিন্তা করব।
আদম

15
select @i:=uuid();
update some_table set guid = (@i:=uuid());

4
নিখুঁত নিখুঁত নিখুঁত !! এ জাতীয় ছোট জিনিস বিশাল প্রভাব ফেলতে পারে !!
thekosmix

5

ইউআইডিগুলি উত্পন্ন হওয়ার সাথে সাথে সংশোধন করার চেষ্টা করার সময় আমি একটি অদ্ভুত ফলাফল দিয়ে শেষ করেছিলাম কেবলমাত্র একটি ছোট্ট সংযোজন। আমি দেখেছি উত্তর দ্বারা রাকেশ , সবচেয়ে সহজ যে ভাল কাজ হতে ক্ষেত্রে যেখানে আপনি ড্যাশ স্ট্রিপ করতে চান ছাড়া।

রেফারেন্সের জন্য:

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(), '-', ''));

প্রতিক্রিয়ার সাথে একটি ইউইউডি উত্পন্ন করার জন্য যখন সাবকোয়ারিটি ঘিরে রয়েছে তখন মনে হয় এটি কেবল একবার ইউইউডি কোয়েরি চালায় যা সম্ভবত আমার চেয়ে অনেক বেশি বুদ্ধিমান বিকাশকারীদের কাছে অপ্টিমাইজেশন হিসাবে নিখুঁত ধারণা দেয় তবে এটি আমার কাছে যায় নি didn't

এটি সমাধানের জন্য, আমি এটি দুটি প্রশ্নের মধ্যে বিভক্ত করেছি:

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

4
আমি প্রশ্নটি পড়ার সময় আমার একই ধারণা ছিল, তবে আমি এটি মনে করি না: তার কলামগুলির মতো শব্দগুলিতে মান রয়েছে তবে অনন্য মান নয়। আপনার উত্তরের অনেক আগে দেওয়া উত্তরগুলি ইতিমধ্যে দেখায় যে কী প্রয়োজন। একটি WHEREধারা থাকা উচিত নয় । এবং উত্পন্ন মানগুলি খুব অনুরূপ, তাই তাদের সত্যই আলাদা হয় তা দেখতে অবশ্যই তাদের ঘনিষ্ঠভাবে দেখতে হবে।
টুলমেকারস্টেভ

3

আমি বেশিরভাগ একই সমস্যার মুখোমুখি ছিলাম। আমি যদি আমার কেস ইউয়েড বিনের (16) হিসাবে সংরক্ষণ করি এবং অনন্য প্রতিবন্ধকতাগুলি রাখি না। এবং আমি এই সমস্যার মুখোমুখি হয়েছি যখন প্রতিটি সারিটির জন্য একই ইউআইডি উত্পন্ন হয়েছিল এবং অনন্য বাধা এটি এর অনুমতি দেয় না। সুতরাং এই কোয়েরিটি কার্যকর হয় না:

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

তবে আমার পক্ষে এটি কার্যকর হয়েছিল, যখন আমি নেস্টেড অভ্যন্তরীণ নির্বাচনের সাথে এই জাতীয় একটি কোয়েরি ব্যবহার করি:

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

তারপরে প্রতিটি প্রবেশের জন্য অনন্য ফলাফল উত্পাদিত হয়।


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

4
আপনার কোডটি কীভাবে কাজ করে সে সম্পর্কে দয়া করে কিছু ব্যাখ্যা যুক্ত করুন। মন্তব্য ছাড়াই কোডটি অন্য এসও ব্যবহারকারীদের পক্ষে বোঝা সর্বদা সহজ নয়
সিমাস জোনেলিউনাস

আপনি যদি বিদ্যমান ডেটাতে ইউইড আপডেট করতে চান তবে আপনার শর্তের সাথে উপরের মত কোয়েরি চালান।
আশুতোষ নিরঞ্জন

1

MYsql

UPDATE tablename   SET columnName = UUID()

ওরাকল

UPDATE tablename   SET columnName = SYS_GUID();

SQL সার্ভার

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()));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.