কোনও মাইএসকিউএল সারণিতে প্রবেশ করুন বা উপস্থিত থাকলে আপডেট করুন


873

আমি একটি ডাটাবেস সারণিতে একটি সারি যুক্ত করতে চাই, তবে একই অনন্য কী সহ কোনও সারি উপস্থিত থাকলে আমি সারিটি আপডেট করতে চাই।

উদাহরণ স্বরূপ:

insert into table (id, name, age) values(1, "A", 19)

আসুন ধরা যাক অনন্য কীটি idএবং আমার ডেটাবেসে একটি সারি রয়েছে id = 1। সেক্ষেত্রে আমি এই মানগুলি সহ সেই সারিটি আপডেট করতে চাই। সাধারণত এটি একটি ত্রুটি দেয়।
যদি আমি insert IGNOREএটি ব্যবহার করি ত্রুটিটিকে উপেক্ষা করবে তবে এটি আপডেট হবে না।


5
এসকিউএল-কে এই ব্যবহারের ক্ষেত্রে একটি অফিসিয়াল সিনট্যাক্স দরকার যা সিনট্যাক্সে মানগুলি নকল করতে বাধ্য করে না এবং প্রাথমিক কী সংরক্ষণ করে।
পিট অ্যালভিন


ক্যাভেট: version.7 সংস্করণ অনুসারে এই পদ্ধতিটি INSERT / আপডেটের ক্রিয়াকলাপ হিসাবে অংশটি সরাসরি সমর্থন করে না। এছাড়াও, একটি আপডেট আপডেট আসলে দুটি পৃথক অপারেশন (ডিলিট এবং INSERT) হিসাবে গণনা করে ... যদি নিরীক্ষণের উদ্দেশ্যে বিবেচিত হয়। (শিখুনবিট)
ড্রেফটিম্যাক

উত্তর:


1598

ব্যবহার INSERT ... ON DUPLICATE KEY UPDATE

প্রশ্ন:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name="A", age=19

86
+1 আমি যা খুঁজে পেয়েছি তা থেকে, এই পদ্ধতিটি স্বয়ংক্রিয়ভাবে বৃদ্ধি কীগুলি এবং অন্য অনন্য কী সংঘর্ষগুলির জন্য রিপ্লেস ইনটোর চেয়ে কম সমস্যাযুক্ত এবং এটি আরও কার্যকর।
অ্যান্ড্রু এনসলে

46
আমি আপনাদের সবাইকে এটির ইঙ্গিত জানি, তবে আমি অন্যের জন্য সুস্পষ্ট হতে চাই। আপনি যে আইডিটি sertোকান তা যদি প্রাথমিক কী বা অনন্য না হয় তবে এটি কার্যকর হবে না। এটি প্রাথমিকভাবে আমার পক্ষে কাজ করেনি কারণ আমার আইডিটি অনন্য ছিল না।
কেভেন

7
আমি অবাক হই কেন সফলভাবে (ডুপ্লিকেট কীতে) একক সারি আপডেট করার পরে affected row countফলাফল আসে 2? অন্য কারও এই ফল ছিল? (ডেটা সঠিকভাবে আপডেট হয়েছে: যার অর্থ মাত্র 1 টি সারি আপডেট করা হয়েছে)
দিমিত্রি কে

14
এটি কিছুটা দেরিতে হলেও যাইহোক: ম্যানুয়ালটিতে বলা হয়েছে যে ON DUPLICATE KEY UPDATEক্ষতিগ্রস্থ সারিগুলিকে ২ দ্বারা বৃদ্ধি করে আপডেট করা হয় তবে কিছুই যদি বাস্তবে আপডেট না হয় তবে এটি নিয়মিত 0 হিসাবে রিপোর্ট করে (নিয়মিত হিসাবে একই UPDATE)।
ভেটেভ

61
এছাড়াও নোট করুন যে আপনি সন্নিবেশ করানোর চেষ্টা করেছেন তার মূল্য উল্লেখ করতে ভ্যালু (নাম) ব্যবহার করতে পারেন যেমন সন্নিবেশ INTO টেবিল (আইডি, নাম, বয়স) ভ্যালুস (1, "এ", 19) কী কী আপডেটের নাম = মূল্য (নাম) , বয়স = ভ্যালু (বয়স)
কৌতূহলী স্যাম

246

প্রতিস্থাপন পরীক্ষা করে দেখুন

http://dev.mysql.com/doc/refman/5.0/en/replace.html

REPLACE into table (id, name, age) values(1, "A", 19)

11
@ পিওনটেক কারণ এটিকে সংক্ষিপ্ত এবং বুঝতে সহজ এবং কেউ "ডুপ্লিকেটতে সন্নিবেশ" কেন ভাল তা ব্যাখ্যা করেন নি।
মিঃ_চিম্প

77
এটি রেকর্ডের আইডি পরিবর্তন করে এবং এর ফলে বিদেশী রেফারেন্স নষ্ট হতে পারে।
বোহ

102
প্রতিস্থাপনের সাথে অন্যান্য সমস্যাটি হ'ল আপনাকে অবশ্যই সমস্ত ক্ষেত্রের জন্য মান নির্দিষ্ট করতে হবে ... অন্যথায় ক্ষেত্রগুলি হারিয়ে যাবে বা ডিফল্ট মানগুলির সাথে প্রতিস্থাপিত হবে। প্রতিস্থাপনের মধ্যে মূলত সারিটি উপস্থিত থাকলে মুছে ফেলা হয় এবং নতুন সারিটি সন্নিবেশ করানো হয়। উদাহরণস্বরূপ, আপনি যদি টেবিলের পরিবর্তে (আইডি, বয়স) মান (1, 19) করেন তবে নাম ক্ষেত্রটি শূন্য হয়ে যাবে।
ডেল

33
এটি আসলে পুরো সারিটি মুছে ফেলুন এবং নতুন INSERT সম্পাদন করুন।
এমজেবি

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

54

ব্যাচ সন্নিবেশ করার সময় নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করুন:

INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)
ON DUPLICATE KEY UPDATE
    name = VALUES (name),
    ...

আপনি যদি নতুন মানটি পরিচালনা করতে চান তবে খুব দরকারী
ক্ষুধার্ত

যদি VALUES(name)কাজ না করে, আপনি চেষ্টা করতে পারেনname = 'name_value',...;
Son Pham

26

এটি ব্যবহার করে দেখুন:

INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;

আশাকরি এটা সাহায্য করবে.


6
আসলে আমার নতুন আইডি দিয়ে অন্য সারিতে নতুন মান যুক্ত করার দরকার নেই পরিবর্তে আমি আইডি = 1 এর বিদ্যমান মানগুলি এই মানগুলির সাথে প্রতিস্থাপন করতে চাই। (যেমন আমি এই বর্ধিত আইডিটি বুঝি এবং ডেটা যুক্ত করি)
কেশান

49
আমি মনে করি না তিনি অনুলিপিগুলিতে একটি করে আইডি বাড়াতে চান।
ডনি

7
"সীমাবদ্ধতা" আপনি যে শব্দটির সন্ধান করছেন তা নয় :) দুর্ভাগ্যক্রমে, এখন আমি "সীমালংঘন" দেখেছি, আমি আর আসল শব্দটি কল্পনা করতে পারি না ..
mwfearnley

1
আপনি কি "ট্র্যাভার্স" বা "কভার" সন্ধান করছেন?
ক্রিস দেব

4
@mwfearnley আপনি যে শব্দটি ভিজ্যুয়ালাইজ করার চেষ্টা করছেন সেটি হ'ল "অতিক্রম"। কেবলমাত্র দেড় বছর সময় লেগেছে :-)
মাইকেল ক্রেবস

20

এটা চেষ্টা কর:

INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'

দ্রষ্টব্য:
এখানে যদি আইডিটি প্রাথমিক কী হয় তবে id='1'প্রতিবার সন্নিবেশ করার চেষ্টা সহ প্রথম সন্নিবেশের পরে id='1'নাম এবং বয়স আপডেট হবে এবং পূর্বের নামটির বয়স পরিবর্তন হবে।


আমি আইডি ব্যবহার না করেই কাজ করতে চাই । আপনি কি প্রাথমিক কী ছাড়া চেষ্টা করেছেন?
ersks

@ কর্মীরা প্রশ্নটি দেখে। ব্যবহারকারী যখন সেখানে একটি অনন্য কী আছে সে সম্পর্কে জিজ্ঞাসা করেছিলেন
রাসেল

আমি এটি পেয়েছি, তবে আমি আমার সমস্যাটি সমাধান করার চেষ্টা করছি যাতে এই একমাত্র মানগুলি জানে। সুতরাং, এই পরিস্থিতিতে আমি সঠিক সমাধান আশা করে উপরে মন্তব্য লিখেছি।

15
INSERT IGNORE INTO table (id, name, age) VALUES (1, "A", 19);

INSERT INTO TABLE (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE NAME = "A", AGE = 19;

REPLACE INTO table (id, name, age) VALUES(1, "A", 19);

এই সমস্ত সমাধান আপনার প্রশ্ন সম্পর্কিত কাজ করবে।

আপনি যদি এই বিবৃতি সম্পর্কিত বিশদ জানতে চান তবে এই লিঙ্কটি দেখুন


REPLACEলিঙ্কযুক্ত নথিতে নথিভুক্ত করা হয় না।
রে বাক্সটার

টাইপো পূর্ণ পূর্ণ sql কোয়েরি, আপনার উদাহরণ কাজ করবে না। এটি টেবিলে অন্তর্ভুক্ত করুন (টেবিলে নয়) এবং ডুপ্লিকেট কী আপডেট (অনুলিপি আপডেট আপডেটে নয়) ON কে এটি সমর্থন করছে তা নিশ্চিত নয়
রবার্ট সিনক্লেয়ার

1
টাইপস ত্রুটির জন্য দুঃখিত। আমাকে সংশোধন করার জন্য ধন্যবাদ
দিলরাজ সিং

11

এসকিউএলাইট ব্যবহার করার সময়:

REPLACE into table (id, name, age) values(1, "A", 19)

প্রদত্ত যে idপ্রাথমিক কী। অন্যথায় এটি কেবল একটি সারি সন্নিবেশ করায়। দেখুন ঢোকান (SQLite)।


যা replace intoহ'ল "প্রবেশ করানো বা বিদ্যমান থাকা অবস্থায় আপডেট করা"। @ ওল্ড
ডনসং

+1 (3 এর 1) আমি আমার অবস্থার জন্য এটি কাজ করতে পেরেছি - আমার বিদ্যমান সারিটি একটি অনন্য কী দিয়ে প্রতিস্থাপন করতে হবে বা যদি সেখানে না থাকে তবে সারিটি যুক্ত করুন। সহজ সমাধান এখানে।
থেরোবাইওয়াক

(3 এর 2) আমার ক্যোয়ারী:CREATE TRIGGER worklog_update AFTER INSERT ON worklog FOR EACH ROW REPLACE INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = (SELECT PROJECT FROM jiraissue WHERE NEW.issueid = jiraissue.ID ) AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW();
30-25

(3 এর 3) সংশ্লিষ্ট প্রশ্ন / উত্তর stackoverflow.com/questions/41767517/...
therobyouknow

2
মাইএসকিএলে এর সাথে সমস্যাটি হ'ল প্রতিস্থাপনটি যদি অন্য মানগুলি সরবরাহ না করা হয় তবে তা সরিয়ে ফেলবে। তবে @
ফিবিয়ানো

10

কেবলমাত্র আমি এখানে এই সমাধানটির সন্ধান করছিলাম তবে অন্য একটি অনুরূপ-কাঠামোগত টেবিল থেকে আপডেট করার জন্য (আমার ক্ষেত্রে ওয়েবসাইট টেস্ট ডিবি লাইভ ডিবিতে পরীক্ষা করার জন্য):

INSERT  live-db.table1
SELECT  *
FROM    test-db.table1 t
ON DUPLICATE KEY UPDATE
        ColToUpdate1 = t.ColToUpdate1,
        ColToUpdate2 = t.ColToUpdate2,
        ...

অন্য কোথাও উল্লিখিত হিসাবে, আপনি যে কলামগুলি আপডেট করতে চান সেগুলি কেবল পরে অন্তর্ভুক্ত করা দরকার ON DUPLICATE KEY UPDATE

INSERTবা এর মধ্যে কলামগুলি তালিকাভুক্ত করার দরকার নেই SELECT, যদিও আমি সম্মত এটি সম্ভবত আরও ভাল অনুশীলন।


4

ক্ষেত্রে যে আপনি একটি করতে চেয়েছিলেন সালে non-primaryমানদণ্ড / শর্ত হিসাবে ক্ষেত্র ON DUPLICATE, আপনি একটি করতে পারেন UNIQUE INDEXট্রিগার যে টেবিলের উপর কী DUPLICATE

ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`);

এবং যদি আপনি টেবিলে অনন্য করতে দুটি ক্ষেত্র একত্রিত করতে চান তবে আপনি শেষ প্যারামিটারে আরও যোগ করে এটি অর্জন করতে পারেন।

ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`, `age`);

দ্রষ্টব্য, কেবলমাত্র অন্যান্য সমস্ত সারি জুড়ে একই nameএবং ageমান রয়েছে এমন সমস্ত ডেটা মুছে ফেলার বিষয়টি নিশ্চিত করুন ।

DELETE table FROM table AS a, table AS b WHERE a.id < b.id 
AND a.name <=> b.name AND a.age <=> b.age;

এর পরে, এটি ON DUPLICATEইভেন্টটি ট্রিগার করা উচিত ।

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name = VALUES(name), age = VALUES(age)

2

আমার ক্ষেত্রে আমি নীচে প্রশ্নের তৈরি করেছি তবে প্রথম ক্যোয়ারীতে যদি id1 টি ইতিমধ্যে উপস্থিত থাকে এবং বয়স ইতিমধ্যে থাকে তবে এর পরে যদি আপনি প্রথম ageমানটি ব্যতীত তৈরি করেন তবে মানটি ageকোনও হবে না

REPLACE into table SET `id` = 1, `name` = 'A', `age` = 19

উপরের সমস্যা এড়াতে নীচের মত কোয়েরি তৈরি করুন

INSERT INTO table SET `id` = '1', `name` = 'A', `age` = 19 ON DUPLICATE KEY UPDATE `id` = "1", `name` = "A",`age` = 19

এটা আপনাকে সাহায্য করবে ...


2
কেউ কি জানেন যে কেন আমাদের অবশ্যই দুটিবার মান নির্ধারণ করতে হবে? মাইএসকিউএল কেন সমস্ত অ্যাসাইনমেন্টের বিবৃতিগুলি নকল না করে অনুলিপি কী আপডেটে ক্যোয়ারীটি শেষ করতে দেয় না? কিছু ডাটাবেস সারণীতে অনেকগুলি কলাম থাকে এবং এগুলি অপ্রয়োজনীয় / কৃতজ্ঞ বলে মনে হয়। আমি বুঝতে পারি কেন আমাদের কাছে বিকল্প অ্যাসাইনমেন্টের বিকল্প রয়েছে, তবে কেন সেগুলি বাদ দেওয়ার বিকল্প নেই? কারও জানা থাকলে শুধু কৌতূহলী।
নীল জল

2

সেক্ষেত্রে আপনি পুরানো মাঠ রাখতে চান (যেমন: নাম)। ক্যোয়ারীটি হ'ল:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name=name, age=19;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.