অন্যের মান সহ একটি মাইএসকিউএল টেবিল আপডেট করুন


94

আমি অন্যের তথ্যের ভিত্তিতে একটি মাইএসকিউএল টেবিল আপডেট করার চেষ্টা করছি।

আমার originalটেবিলটি দেখতে:

id | value
------------
1  | hello
2  | fortune
3  | my
4  | old
5  | friend

এবং tobeupdatedটেবিলটি দেখতে:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        |    | old
4        |    | friend
5        |    | fortune

আমি আপডেট করতে চান idমধ্যে tobeupdatedদিয়ে idথেকে originalউপর ভিত্তি করে value(সঞ্চিত স্ট্রিং VARCHAR(32)ক্ষেত্র)।

আপডেট হওয়া টেবিলটি আশা করি এমন দেখাবে:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        | 4  | old
4        | 5  | friend
5        | 2  | fortune

আমার একটি ক্যোয়ারী রয়েছে যা কাজ করে তবে এটি খুব ধীর:

UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value

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

এর মতো মানগুলি আপডেট করার আরও ভাল উপায় আছে কি? আমি একীভূত ফলাফলের জন্য একটি তৃতীয় টেবিল তৈরি করতে পারি, তা যদি দ্রুত হয়?

আমি মাইএসকিউএল চেষ্টা করেছি - অন্য টেবিলের মান সহ আমি কীভাবে একটি টেবিল আপডেট করতে পারি? , কিন্তু এটি আসলে সাহায্য করেনি। কোন ধারনা?

একটি মাইএসকিউএল নবাগতকে সাহায্য করার জন্য অগ্রিম ধন্যবাদ!


4
আপনার 'মান' কলামে কি কোনও সূচক রয়েছে?
নুডল

হাই নুডল; না, valueএই মুহুর্তে কোনও সূচক নেই।
সুপারইঞ্জেল

উত্তর:


213
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id

এটি করা উচিত এবং সত্যই এটি আপনার যা ঠিক তা করা doing তবে, আমি একাধিক 'WHERE' শর্তের পরিবর্তে যোগদানের জন্য 'যোগ' সিনট্যাক্সকে পছন্দ করি, আমার মনে হয় এটি পড়া সহজ

ধীর চলমান হিসাবে, টেবিলগুলি কত বড়? আপনার উপর tobeupdated.valueএবং সূচক থাকা উচিতoriginal.value

সম্পাদনা: আমরা কোয়েরিটিও সহজ করতে পারি

UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id

USINGশর্টহ্যান্ড যখন একটি যোগদানের দুটি টেবিলের keyমতো একটি অভিন্ন নাম থাকে id। যেমন একটি ইকুই-জয়েন - http://en.wikedia.org/wiki/Join_(SQL)#Equi-join


4
ধন্যবাদ ওয়্যারড! এটি পুরোপুরি কাজ করে। সারণীগুলি বেশ বড় ( original100,000+ এন্ট্রি এবং tobeupdated10,000+), তাই আমি সূচকগুলি সম্পর্কে আপনার এবং নুডলের পরামর্শ নিয়েছি এবং পুরো ক্যোয়ারী এখন এক সেকেন্ডের মধ্যে শেষ হয়েছে। আমি পার্থক্য বিশ্বাস করতে পারি না !? আপনার সাহায্যের জন্য অনেক ধন্যবাদ; আমি অনেক কিছু শিখেছি!
সুপারইঞ্জেল

5
শুনে খুব ভালো লাগছে :) আমি এখানেও অনেক কিছু শিখলাম। আপনি এই সাইটটি সত্যিই পছন্দ করি কারণ আপনি অনেকগুলি বিভিন্ন সমস্যা এবং ধারণা প্রকাশ করতে পারেন
wire00

আপনাকে ধন্যবাদ .. আমি
স্ট্যাকওভারফ্লো

কেবল উল্লেখ করতে চেয়েছিলাম যে WHOE এর সাথে একটি সাধারণ আপডেট প্রায় 10.000 সারি।
অ্যালেক্স

4
তারা মূল উপাদান অবশ্যই সূচি হিসাবে নির্ধারিত হয়। এগুলি ছাড়াই টাইমআউটের বিপরীতে আমাকে 4 সেকেন্ডে 300K রেকর্ড আপডেট করতে নিয়ে গেছে।
আমজো

0

এটি সেই টেবিলগুলির কী ব্যবহার তা নির্ভর করে তবে আপনি sertোকাতে এবং আপডেট করতে আসল টেবিলের উপর ট্রিগার স্থাপন বিবেচনা করতে পারেন। সন্নিবেশ বা আপডেট হয়ে গেলে মূল টেবিল থেকে কেবল একটি আইটেমের উপর ভিত্তি করে দ্বিতীয় সারণি আপডেট করুন। এটি দ্রুত হবে।


ধন্যবাদ অগ্নিগ্রহ; আমি এর আগে কখনও ট্রিগার ব্যবহার করিনি, তবে আমি সেগুলি অবশ্যই পড়ব।
সুপারইঞ্জেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.