আমি উপস্থিত থাকলে কীভাবে আপডেট করব, মাইএসকিউএলে (একে একে "উপস্থাপনা" বা "মার্জ" না থাকলে sertোকান)?


152

INSERTকোনও UPDATEমাইএসকিউএল কোয়েরি ব্যবহার করে যখন সারিটি উপস্থিত না থাকে বা এটি উপস্থিত থাকে তখন কি কোনও সহজ উপায় আছে ?

উত্তর:


191

ব্যবহার INSERT ... ON DUPLICATE KEY UPDATE। উদাহরণ স্বরূপ:

INSERT INTO `usage`
(`thing_id`, `times_used`, `first_time_used`)
VALUES
(4815162342, 1, NOW())
ON DUPLICATE KEY UPDATE
`times_used` = `times_used` + 1

10
হ্যাঁ, আমি বিশ্বাস করি এসকিউএল সার্ভারের সমতুল্য বলা হয় MERGE। সাধারণভাবে, ধারণাটি প্রায়শই হিসাবে উল্লেখ করা হয় "UPSERT"
বিশৃঙ্খলার

3
@ ব্লুব: আপনি যদি একটি অনন্য কী তৈরি করেন gebএবং topicএটি কার্যকর হবে ( ALTER TABLE table ADD UNIQUE geb_by_topic (geb, topic))।
বিশৃঙ্খলা

1
@ ব্রায়ান: ওরাকল এর সমতুল্যও বলা হয় MERGEতবে আমি নিশ্চিত নই যে এর বাক্য গঠনটি এসকিউএল সার্ভারের সাথে অভিন্ন কিনা।
কেন কেইনান

1
@ ব্রুকস: আপনি যদি এটি 0 প্রদান করেন তবে এটি 0 হিসাবে মান হিসাবে ব্যবহার করবে। সুতরাং এটি করবেন না। আচরণকে কাজ NULLকরার অনুমতি দেওয়ার জন্য এটি কোনও কিছু পাস করবেন না বা এটিকে পাস করবেন না auto_increment(যা অন্যথায়, হ্যাঁ, আপনি যেমন অনুমান করছেন তেমন কাজ করে; দেখুন dev.mysql.com/doc/refman/5.5/en/example-auto-increment)। এইচটিএমএল )।
বিশৃঙ্খলা

3
আপনাকে ধন্যবাদ, এবং আপনি VALUES(col)সদৃশ ক্ষেত্রে সন্নিবেশ যুক্তি থেকে মান পেতে ব্যবহার করতে পারেন । উদাহরণস্বরূপ:ON DUPLICATE UPDATE b = VALUES(b), c = VALUES(c)
20:51

5

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে গুগল সম্প্রতি আমাকে এখানে নিয়েছে তাই আমি কল্পনা করি অন্যরাও এখানে আসবেন।

@ চাওস সঠিক: INSERT ... ON DUPLICATE KEY UPDATEবাক্য গঠন আছে।

যাইহোক, মূল প্রশ্নটি বিশেষত মাইএসকিউএল সম্পর্কে জিজ্ঞাসা করেছিল এবং মাইএসকিউএলে REPLACE INTO ...বাক্য গঠন রয়েছে। আইএমএইচও, এই কমান্ডটি উপস্থাপকের জন্য ব্যবহার করা সহজ এবং আরও সহজ। ম্যানুয়াল থেকে:

প্রতিস্থাপন হ'ল INSERT এর মতো কাজ করে, ব্যতীত যদি টেবিলের কোনও পুরনো সারিটি PRIARY KEY বা UNIQUE সূচকের জন্য একটি নতুন সারিটির সমান মান থাকে তবে নতুন সারিটি সন্নিবেশ করার আগে পুরানো সারিটি মুছে ফেলা হয়।

নোট করুন এটি স্ট্যান্ডার্ড এসকিউএল নয়। ম্যানুয়াল থেকে একটি উদাহরণ:

CREATE TABLE test (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  data VARCHAR(64) DEFAULT NULL,
  ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.04 sec)

mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 2 rows affected (0.04 sec)

mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts                  |
+----+------+---------------------+
|  1 | New  | 2014-08-20 18:47:42 |
+----+------+---------------------+
1 row in set (0.00 sec)

সম্পাদনা করুন: ঠিক একটি ন্যায্য সতর্কতা যা REPLACE INTOপছন্দ করে না UPDATE। যেমন ম্যানুয়ালটি বলেছে, REPLACEসারিটি বিদ্যমান থাকলে তা মুছে দেয়, তারপরে একটি নতুন সন্নিবেশ করান। (উপরের উদাহরণে মজাদার "2 টি সারিগুলি প্রভাবিত করুন" নোট করুন)) এটি বিদ্যমান রেকর্ডের সমস্ত কলামের মানগুলি প্রতিস্থাপন করবে (এবং কেবল কিছু কলাম আপডেট করে না )) মাইএসকিউএল এর আচরণ REPLACE INTOঅনেকটা স্ক্লাইটের মতোই INSERT OR REPLACE INTO। আপনি যদি রেকর্ডটি ইতিমধ্যে বিদ্যমান থাকে তবে কেবলমাত্র কয়েকটি কলাম (এবং সমস্ত কলাম নয়) আপডেট করতে চাইলে কিছু কাজের ক্ষেত্রে এই প্রশ্নটি দেখুন question

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