जवाबों:
का उपयोग करें 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
geb
और topic
यह काम करेगा ( ALTER TABLE table ADD UNIQUE geb_by_topic (geb, topic)
)।
MERGE
लेकिन मुझे यकीन नहीं है कि इसका सिंटैक्स SQL सर्वर के समान है।
NULL
, auto_increment
व्यवहार को काम करने की अनुमति देने के लिए (जो अन्यथा, हां, जैसा कि आप निर्धारित करते हैं, dev.mysql.com/doc/refman/5.5/en/example-auto-increment देखें । html )।
VALUES(col)
डुप्लिकेट के मामले में सम्मिलित तर्क से मूल्य प्राप्त करने के लिए उपयोग कर सकते हैं । जैसे:ON DUPLICATE UPDATE b = VALUES(b), c = VALUES(c)
मुझे पता है कि यह एक पुराना सवाल है, लेकिन 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
। कुछ कार्यपत्रकों के लिए यह प्रश्न देखें कि क्या आप केवल कुछ कॉलम (और सभी कॉलम नहीं) अपडेट करना चाहते हैं यदि रिकॉर्ड पहले से मौजूद है।
MERGE
। सामान्य तौर पर, अवधारणा को अक्सर कहा जाता है"UPSERT"
।