মাইএসকিউএল সারণি সন্নিবেশ যদি না থাকে অন্যথায় আপডেট


105
UPDATE AggregatedData SET datenum="734152.979166667", 
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";

এটি datenumবিদ্যমান থাকলে এটি কাজ করে তবে আমি datenumউপস্থিত না থাকলে এই তথ্যটি একটি নতুন সারি হিসাবে সন্নিবেশ করতে চাই ।

হালনাগাদ

ডেটনামটি অনন্য তবে এটি প্রাথমিক কী নয়


2
"ডেটনাম" কি অনন্য? আপনি INSERT ব্যবহার করতে পারেন ... যদি তা হয় তবে চালিত কী আপডেটের জন্য।
জ্যাকব

উত্তর:


143

জয় আপনার ব্যবহার করা উচিত যে সঠিক INSERT ... ON DUPLICATE KEY UPDATE

নোট করুন যে আপডেটের ধারাটিতে আপনাকে ডেটনাম অন্তর্ভুক্ত করার দরকার নেই যেহেতু এটি অনন্য কী, তাই এটি পরিবর্তন করা উচিত নয়। আপনার টেবিল থেকে অন্যান্য কলামগুলির সমস্ত অন্তর্ভুক্ত করার দরকার নেই। VALUES()অন্যান্য কলামগুলি আপডেট করার সময় সঠিক মানগুলি ব্যবহৃত হচ্ছে তা নিশ্চিত করতে আপনি ফাংশনটি ব্যবহার করতে পারেন ।

এখানে আপনার আপডেটটি INSERT ... ON DUPLICATE KEY UPDATEমাইএসকিউএল-এর জন্য সঠিক সিনট্যাক্স ব্যবহার করে পুনরায় লেখা হয়েছে :

INSERT INTO AggregatedData (datenum,Timestamp)
VALUES ("734152.979166667","2010-01-14 23:30:00.000")
ON DUPLICATE KEY UPDATE 
  Timestamp=VALUES(Timestamp)

18
INSERT ব্যবহার করার সময় সতর্কতা অবলম্বন করুন ... একাধিক অনন্য বা প্রাথমিক কী থাকা টেবিলের বিপরীতে টেবিলগুলিতে নকল কী আপডেটের উপর। মাইএসকিউএল ডকুমেন্টেশন থেকে নেওয়া : এছাড়াও, মাইএসকিউএল 5.5.24 দিয়ে শুরু করে একটি ইনসার্ট ... একটি অনন্য বা প্রাথমিক কী থাকা টেবিলের বিপরীতে মূল কী আপডেটের বিবৃতিটিও অনিরাপদ হিসাবে চিহ্নিত করা হয়েছে। (বাগ # 11765650, বাগ # 58637) বাগ 58637 বিবরণ bugs.mysql.com/bug.php?id=58637
ব্রডব্যান্ড

1
এটি ব্যবহার করে UNIQUEসীমাবদ্ধতা তৈরি করার প্রয়োজন হতে পারে TimestampALTER TABLE AggregatedData ADD UNIQUE (Timestamp)
অব্যক্ত

@ ব্রডব্যান্ড আপনি এই বাগটি এড়াতে একটি যৌগিক কী ব্যবহার করতে পারেন
কারিম

16

ব্যবহার করার চেষ্টা করুন এই :

আপনি যদি নির্দিষ্ট করে থাকেন ON DUPLICATE KEY UPDATEএবং একটি সারি সন্নিবেশ করা হয়েছে যা পুরানো সারিটির একটি UNIQUE index orমূল কী , MySQL performs an [আপডেটে] [ http://dev.mysql.com/doc/refman/5.7/en/update.html ) এর সদৃশ মান ঘটাবে । ..

ON DUPLICATE KEY UPDATEদফা একাধিক কলাম বরাদ্দকরণ কমা দ্বারা পৃথক থাকতে পারে।

এর সাথে ON DUPLICATE KEY UPDATE, সারিতে প্রতি প্রভাবিত-সারিগুলির মানটি সারিটি নতুন সারি হিসাবে সন্নিবেশ করা হলে 1, বিদ্যমান সারিটি আপডেট করা হলে 2 এবং বিদ্যমান সারিটি তার বর্তমান মানগুলিতে সেট করা থাকলে 0 হয় is আপনি যদি mysqld এ সংযোগ CLIENT_FOUND_ROWSকরার mysql_real_connect()সময় পতাকাটি নির্দিষ্ট করে থাকেন , তবে বিদ্যমান সারিটির বর্তমান মানগুলিতে সেট করা থাকলে আক্রান্ত-সারিগুলির মান 1 (0 নয়) হয় ...


তবে আমার ডেটনাম প্রাথমিক কী নয়।
OHLÁLÁ

সুতরাং আমার ক্ষেত্রে সমাধানটি কী, আমি কোনও সমাধান ছাড়াই এটিকে চেষ্টা করে দেখেছিলাম: INSERT INTO forwind.aggregateddata (ডেটনাম, টাইমস্ট্যাম্প, মিনিট_ফ 1_বারো_20_) ভ্যালু ('1', '2', '3') ডুপ্লিকেট কী আপডেটের তারিখের তারিখ = datenum;
OHLÁLÁ

1
ডেটনাম কি অনন্য বলে মনে হয়? যদি হ্যাঁ, এটিতে একটি অনন্য সূচক যুক্ত করার চেয়ে (যদি ইতিমধ্যে যোগ না করা হয়) তবে এটি কার্যকর হবে। পড়ুন dev.mysql.com/doc/refman/5.1/en/alter-table.html জন্য বিজ্ঞাপন অনন্য ইনডেক্স কিভাবে
জয়

এখন আমি ডেটনামটি অনন্য হিসাবে সংজ্ঞায়িত করেছি, এবং এটি ঠিক আছে, ধন্যবাদ
ওহল্লী

1
একটি লিঙ্ক, সম্ভবত একটি উত্তর দিতে।
অ্যান্ড্রু

0

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

replace into last_recogs (id, hasher_id, hash_id, last_recog) 
  select l.* from 
    (select id, hasher_id, hash_id, [new_value] from last_recogs 
     where hasher_id in (select id from hashers where name=[hasher_name])
     and hash_id in (select id from hashes where name=[hash_name]) 
     union 
     select 0, m.id, h.id, [new_value] 
     from hashers m cross join hashes h 
     where m.name=[hasher_name] 
     and h.name=[hash_name]) l 
  limit 1;

এই উদাহরণটি আমার একটি ডাটাবেস থেকে আঁকানো হয়েছে, ইনপুট প্যারামিটারগুলি (দুটি নাম এবং একটি নম্বর) [হ্যাশ_নাম], [হ্যাশ_নাম], এবং [নতুন_মূল্য] দিয়ে প্রতিস্থাপন করা হয়েছে। নেস্টেড নির্বাচন করুন ... সীমাবদ্ধ 1 বিদ্যমান রেকর্ডের মধ্যে প্রথমটি টেনে নেয় বা একটি নতুন রেকর্ড (সর্বশেষ_আরকোগস.আইডি একটি স্বতঃসংশোধন প্রাথমিক কী)) এবং এটি প্রতিস্থাপনের মধ্যে মান ইনপুট হিসাবে ব্যবহার করে।


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