यदि मैं मौजूद है तो मैं कैसे अपडेट करूं, यदि MySQL में एके "अपटार्स" या "मर्ज" न हो तो सम्मिलित करें?


152

क्या INSERTएक पंक्ति का एक आसान तरीका है जब यह मौजूद नहीं है, या UPDATEयदि यह मौजूद है, तो एक MySQL क्वेरी का उपयोग कर?

जवाबों:


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
हाँ, मेरा मानना ​​है कि SQL सर्वर के समकक्ष कहा जाता है MERGE। सामान्य तौर पर, अवधारणा को अक्सर कहा जाता है "UPSERT"
अराजकता

3
@blub: यदि आप एक अद्वितीय कुंजी बनाते हैं gebऔर topicयह काम करेगा ( ALTER TABLE table ADD UNIQUE geb_by_topic (geb, topic))।
अराजकता

1
@ ब्रायन: ओरेकल के समकक्ष भी कहा जाता है, MERGEलेकिन मुझे यकीन नहीं है कि इसका सिंटैक्स SQL ​​सर्वर के समान है।
केन कीनन

1
@ बरोक: यदि आप इसे 0 पास करते हैं, तो यह वास्तव में 0 को मान के रूप में उपयोग करेगा। तो ऐसा मत करो। इसे कुछ भी पास न करें, या इसे पास न करें NULL, auto_incrementव्यवहार को काम करने की अनुमति देने के लिए (जो अन्यथा, हां, जैसा कि आप निर्धारित करते हैं, dev.mysql.com/doc/refman/5.5/en/example-auto-increment देखें । html )।
अराजकता

3
धन्यवाद, और आप VALUES(col)डुप्लिकेट के मामले में सम्मिलित तर्क से मूल्य प्राप्त करने के लिए उपयोग कर सकते हैं । जैसे:ON DUPLICATE UPDATE b = VALUES(b), c = VALUES(c)
गेरेटन

5

मुझे पता है कि यह एक पुराना सवाल है, लेकिन Google मुझे यहां ले जाता है इसलिए मुझे लगता है कि अन्य लोग भी यहां आते हैं।

@चोस सही है: INSERT ... ON DUPLICATE KEY UPDATEवाक्यविन्यास है।

हालाँकि, मूल प्रश्न विशेष रूप से MySQL के बारे में पूछा गया था, और MySQL में REPLACE INTO ...वाक्य रचना है। IMHO, यह कमांड आसान और अधिक सरल है जो upserts के लिए उपयोग किया जाता है। मैनुअल से:

REPLACE बिलकुल INSERT की तरह काम करता है, सिवाय इसके कि अगर तालिका में एक पुरानी पंक्ति में PRIMARY KEY या UNIQUE इंडेक्स के लिए नई पंक्ति के समान मूल्य है, तो नई पंक्ति सम्मिलित होने से पहले पुरानी पंक्ति हटा दी जाती है।

ध्यान दें कि यह मानक SQL नहीं है। मैनुअल से एक उदाहरण:

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 पंक्तियों को प्रभावित करें" पर ध्यान दें।) यही है, यह मौजूदा रिकॉर्ड के सभी कॉलमों के मूल्यों को बदल देगा (और केवल कुछ कॉलमों को अपडेट नहीं करेगा ।) MySQL का व्यवहार REPLACE INTOबहुत कुछ स्क्लाइट्स की तरह है INSERT OR REPLACE INTO। कुछ कार्यपत्रकों के लिए यह प्रश्न देखें कि क्या आप केवल कुछ कॉलम (और सभी कॉलम नहीं) अपडेट करना चाहते हैं यदि रिकॉर्ड पहले से मौजूद है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.