MySql तालिका सम्मिलित करें यदि मौजूद नहीं है तो अद्यतन करें


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

यह datenumमौजूद है तो काम करता है, लेकिन अगर मौजूद नहीं है तो मैं इस डेटा को एक नई पंक्ति के रूप में सम्मिलित करना चाहता हूं datenum

अपडेट करें

डेटेनम अद्वितीय है, लेकिन यह प्राथमिक कुंजी नहीं है


2
क्या "डेटेनम" अद्वितीय है? यदि यह है तो आप INSERT ... ON DUPLICATE KEY UPDATE का उपयोग कर सकते हैं ।
जैकब

जवाबों:


143

जय सही है जो आपको उपयोग करना चाहिए INSERT ... ON DUPLICATE KEY UPDATE

ध्यान दें कि आपको अपडेट क्लॉज में डेटेनम शामिल करने की आवश्यकता नहीं है क्योंकि यह अद्वितीय कुंजी है, इसलिए इसे बदलना नहीं चाहिए। आपको अपनी तालिका से अन्य सभी स्तंभों को शामिल करने की आवश्यकता है। आप VALUES()यह सुनिश्चित करने के लिए फ़ंक्शन का उपयोग कर सकते हैं कि अन्य कॉलम अपडेट करते समय उचित मानों का उपयोग किया जाता है।

यहां INSERT ... ON DUPLICATE KEY UPDATEMySQL के लिए उचित सिंटैक्स का उपयोग करके आपका अपडेट फिर से लिखा गया है :

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

18
INSERT का उपयोग करते समय सावधान रहें ... एक से अधिक विशिष्ट या प्राथमिक कुंजी वाली तालिका के विरुद्ध तालिकाओं पर DUPLATEATE कुंजी पर अद्यतन करें। MySQL दस्तावेज़ीकरण से लिया गया : इसके अलावा, MySQL 5.5.24, एक INSERT के साथ शुरुआत ... एक अद्वितीय या प्राथमिक कुंजी से अधिक होने वाली तालिका के विरुद्ध DUPLICATE KEY UPDATE कथन को भी असुरक्षित के रूप में चिह्नित किया गया है। (बग # 11765650, बग # 58637) बग 58637 वर्णन Bugs.mysql.com/bug.php?id=58637
ब्रॉडबैंड

1
इसका उपयोग करने के लिए UNIQUEबाधा पैदा करने की आवश्यकता हो सकती है TimestampALTER TABLE AggregatedData ADD UNIQUE (Timestamp)
Avyakt

@ बरोडबैंड आप इस बग से बचने के लिए एक सम्मिश्र कुंजी का उपयोग कर सकते हैं
करीम

16

उपयोग करने का प्रयास इस :

यदि आप निर्दिष्ट करते हैं ON DUPLICATE KEY UPDATE, और एक पंक्ति सम्मिलित की जाती है जो पुरानी पंक्ति के एक UNIQUE index orप्राथमिक कुंजी , MySQL performs an [UPDATE`] ( http://dev.mysql.com/doc/refman/5.7/en/update.html ) में डुप्लिकेट मान का कारण बनेगी । ..

ON DUPLICATE KEY UPDATEखंड एकाधिक स्तंभ कार्य, अल्पविराम के द्वारा अलग हो सकते हैं।

ON DUPLICATE KEY UPDATEयदि पंक्ति एक नई पंक्ति के रूप में डाली गई है, तो यदि मौजूदा पंक्ति को अद्यतन किया जाता है, और ० यदि मौजूदा पंक्ति को उसके मौजूदा मानों पर सेट किया जाता है, तो प्रति पंक्ति के साथ प्रभावित-पंक्तियाँ १ होती हैं। यदि आप mysqld से कनेक्ट करते समय CLIENT_FOUND_ROWSध्वज को निर्दिष्ट करते हैं , तो प्रभावित-पंक्तियों का मान 1 (0 नहीं) है यदि मौजूदा पंक्ति इसके वर्तमान मानों पर सेट है ...mysql_real_connect()


लेकिन मेरा डेटा प्राथमिक कुंजी नहीं है।
OHL49L OH

तो मेरे मामले में क्या समाधान है, मैंने बिना किसी समाधान के यह कोशिश की: INSERT INTO forwind.aggregateddata (datenum, Timestamp, Min_F1_baro_20_) VALUES ('1', '2', '3') DUPLICATE KEY UPDATE डेटेनम = datenum;
OHL:57L OH

1
क्या डेटेनम को अद्वितीय माना जाता है? यदि हाँ, तो इसमें एक अनूठा सूचकांक जोड़ें (यदि पहले से नहीं जोड़ा गया है) तो यह काम करेगा। UNIQUE अनुक्रमित विज्ञापन देने के लिए dev.mysql.com/doc/refman/5.1/en/alter-table.html देखें
जय

अब मैंने डेटेनम को अद्वितीय के रूप में परिभाषित किया, और यह ठीक काम है, धन्यवाद
OHLÁL

1
बस एक लिंक, शायद एक जवाब दे।
एंड्रयू

0

मेरे पास एक ऐसी स्थिति थी जहां मुझे दो फ़ील्ड्स (दोनों विदेशी कुंजियाँ) के अनुसार टेबल पर अपडेट या इंसर्ट करने की ज़रूरत थी, जिस पर मैं एक UNIQUE बाधा नहीं डाल सकता था (इसलिए INSERT ... ON DUPLICATE KEY UPDATE काम नहीं करेगा)। यहाँ मैंने क्या उपयोग किया है:

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;

इस उदाहरण को मेरे एक डेटाबेस से इनपुट मापदंडों (दो नाम और एक संख्या) के साथ बदल दिया गया है जिसे [hasher_name], [hash_name], और [new_value] के साथ बदल दिया गया है। नेस्टेड सेलेक्ट ... लिमिट 1 मौजूदा रिकॉर्ड या नए रिकॉर्ड (last_recogs.id या तो एक ऑटोइंटरमेंट प्राथमिक कुंजी है) के पहले को खींचता है और REPLACE INTO में मूल्य इनपुट के रूप में उपयोग करता है।


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