অন্তর্ভুক্ত করুন ... থেকে নির্বাচন করুন ... দ্বৈত কী আপডেটের উপর


116

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

INSERT INTO lee(exp_id, created_by, 
                location, animal, 
                starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
       t.inact, t.inadur, t.inadist, 
       t.smlct, t.smldur, t.smldist, 
       t.larct, t.lardur, t.lardist, 
       t.emptyct, t.emptydur 
FROM tmp t WHERE uid=x
ON DUPLICATE KEY UPDATE ...; 
//update all fields to values from SELECT, 
//       except for exp_id, created_by, location, animal, 
//       starttime, endtime

আমি নিশ্চিত নই যে এই UPDATEধারাটির বাক্য গঠনটি কী হবে। SELECTধারাটি থেকে আমি কীভাবে বর্তমান সারিটি উল্লেখ করব ?

উত্তর:


172

মাইএসকিউএলটি INSERT INTO कलয়েতে সমান সংখ্যক সমেত রেফারেন্সের পূর্বে অংশটি ধরে নেবে এবং দ্বিতীয় অংশটি নির্বাচন করুন কলামগুলি উল্লেখ করে।

INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
       t.inact, t.inadur, t.inadist, 
       t.smlct, t.smldur, t.smldist, 
       t.larct, t.lardur, t.lardist, 
       t.emptyct, t.emptydur 
FROM tmp t WHERE uid=x
ON DUPLICATE KEY UPDATE entct=t.entct, inact=t.inact, ...

6
@ ডানাগার্ল: টিআইপি: পিকে কলামের কোনও আপডেট করার চেষ্টা করবেন না, কেবল আপডেটের দরকার পড়ে তালিকার মধ্যে যান
লেেক্সু

45
আপনার প্রস্তাবিত বাক্য গঠন কাজ করে এবং এটি t.প্রয়োজনীয়। আমিও xaprb (উপর একটি নিবন্ধ পাওয়া গেছে xaprb.com/blog/2006/02/21/flexible-insert-and-update-in-mysql ) এই সিনট্যাক্স ব্যবহার করে: on duplicate key update b = values(b), c = values(c)। এটিও কাজ করে।
দানাগার

9
দ্রষ্টব্য: যখন নির্বাচনের বিবৃতিটির একটি ধারা দ্বারা গ্রুপ রয়েছে তখন এটি কাজ করবে না
joHN

11
@john যদি নির্বাচন বিবৃতি দফা দ্বারা একটি গ্রুপ আছে করবেন কি
কাসীর

2
dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html মাইএসকিউএল 5.6.4 এ এবং তারপরে , ইনসার্ট ... ডুপ্লিকেট কী নির্বাচন করুন আপডেটের বিবৃতিটি বিবৃতি-ভিত্তিক প্রতিরক্ষার জন্য অনিরাপদ হিসাবে চিহ্নিত করা হয়েছে ... এছাড়াও, মাইএসকিউএল ৫..6. with দিয়ে একটি ইনসার্ট শুরু করে ... একাধিক অনন্য বা প্রাথমিক কী থাকা টেবিলের বিপরীতে মূল কী আপডেটের বিবরণীও অনিরাপদ হিসাবে চিহ্নিত করা হয়েছে `
আবদুল মুনির

51

যদিও আমি এটির জন্য খুব দেরী করেছি তবে যারা ক্লজ INSERT-SELECTদিয়ে ক্যোয়ারী ব্যবহার করতে চেয়েছিলেন তাদের জন্য কিছু বৈধ প্রশ্ন দেখার পরে GROUP BY, আমি এটির জন্য কাজটি নিয়ে এসেছি।

মার্কাস অ্যাডামসের উত্তর নেওয়া এবং এতে অ্যাকাউন্টিং GROUP BY, আমি ব্যবহার করে এইভাবে সমস্যার সমাধান করবSubqueries in the FROM Clause

INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT sb.id, uid, sb.location, sb.animal, sb.starttime, sb.endtime, sb.entct, 
       sb.inact, sb.inadur, sb.inadist, 
       sb.smlct, sb.smldur, sb.smldist, 
       sb.larct, sb.lardur, sb.lardist, 
       sb.emptyct, sb.emptydur
FROM
(SELECT id, uid, location, animal, starttime, endtime, entct, 
       inact, inadur, inadist, 
       smlct, smldur, smldist, 
       larct, lardur, lardist, 
       emptyct, emptydur 
FROM tmp WHERE uid=x
GROUP BY location) as sb
ON DUPLICATE KEY UPDATE entct=sb.entct, inact=sb.inact, ...

8
এটি COUNT, GROUP ইত্যাদির প্রশ্নের জন্য সঠিক উত্তর Thanks ধন্যবাদ।
Kostanos

আপনাকে অনেক ধন্যবাদ, বন্ধু! আমি এই পদ্ধতিকে সত্যই পছন্দ করেছি, বিশেষত কারণ এটি আমাকে ধারাবাহিক অনুসন্ধানের মতো একটি প্রক্রিয়া তৈরি করতে দেয়, যা ইনফ্লুডডিবি'র মতো করে।
মিয়ার

1
এছাড়াও আপনি ক্ষেত্র = মান (ক্ষেত্র) ডুপ্লিকেট আপডেটে যেমন উত্তর মধ্যে ব্যবহার করতে পারে stackoverflow.com/questions/16935896/...
এরিক Melkersson
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.