1 से एक डेटाबेस फ़ील्ड बढ़ाएँ


158

MySQL के साथ, यदि मेरे पास कोई फ़ील्ड है, तो लॉगिन का कहना है, मैं एक sql कमांड के भीतर उस फ़ील्ड को 1 से अपडेट करने के बारे में कैसे जाऊंगा?

मैं एक INSERT क्वेरी बनाने की कोशिश कर रहा हूँ, जो FirstName, lastName और logins बनाता है। हालाँकि अगर पहले और अंतिम नाम का संयोजन पहले से मौजूद है, तो लॉगिन को 1 से बढ़ाएँ।

तो तालिका इस तरह दिख सकती है ..

firstName----|----lastName----|----logins

John               Jones             1
Steve              Smith             3

मैं एक आदेश के बाद हूँ कि जब चलाने के लिए, या तो एक नया व्यक्ति (यानी टॉम रोजर्स) सम्मिलित करेगा या अगर जॉन जोन्स नाम इस्तेमाल किया गया था तो वेतन वृद्धि।

जवाबों:


287

प्रविष्टि अपडेट करना:

एक साधारण वेतन वृद्धि करनी चाहिए।

UPDATE mytable 
  SET logins = logins + 1 
  WHERE id = 12

नई पंक्ति सम्मिलित करें, या पहले से मौजूद होने पर अपडेट करें:

यदि आप पहले से मौजूद पंक्ति को अपडेट करना चाहते हैं, या इसे डालें यदि यह पहले से मौजूद नहीं है, तो आप REPLACEसिंटैक्स या INSERT...ON DUPLICATE KEY UPDATEविकल्प का उपयोग कर सकते हैं (जैसा कि रॉब वैन डैम ने अपने जवाब में प्रदर्शित किया है )।

एक नई प्रविष्टि सम्मिलित करना:

या शायद आप कुछ पसंद कर रहे हैं INSERT...MAX(logins)+1? अनिवार्य रूप से आप निम्नलिखित की तरह एक क्वेरी चलाएंगे - शायद आपकी विशिष्ट आवश्यकताओं के आधार पर थोड़ा अधिक जटिल:

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable

3
इसके अलावा, अपने आवेदन में उपयुक्त के रूप में अपना WHERE क्लॉज जोड़ना सुनिश्चित करें।
BoltClock

क्या सचमे!! मुझे पता नहीं था कि आप ऐसा कर सकते हैं !!! तो क्या यह काम करेगा? INSERT IGNORE mytable (FirstName, lastName, logins) VALUES (जॉन, स्मिथ, लॉगिन = लॉगिन + 1)
मैट

@ मैट नहीं, यह एक INSERT, नहीं है UPDATE। यदि आप एक सम्मिलित करना चाहते हैं, तो आपको अधिकतम प्राप्त करने और इसमें 1 जोड़ने की आवश्यकता होगी।
सैम्पसन

2
@Matt आपके प्रश्न ने " 1 से अपडेट करने के बारे में " जो भ्रम का कारण बना। मुझे लगता है कि आप एक और समाधान की तलाश में हो सकते हैं, जिसे मैंने अपने अद्यतन उत्तर में संदर्भित किया है।
सैम्पसन

1
@ जोंथन कन्फ्यूजन के लिए सॉरी .. मैंने अपना सवाल अपडेट कर लिया है, उम्मीद है कि थोड़ा क्लीयर हो जाएगा ..
मैट

70

यदि आप सुरक्षित रूप से (फर्स्टनाम, लास्ट नेम) PRIMARY KEY बना सकते हैं या कम से कम उन पर UNIQUE कुंजी लगा सकते हैं, तो आप ऐसा कर सकते हैं:

INSERT INTO logins (firstName, lastName, logins) VALUES ('Steve', 'Smith', 1)
ON DUPLICATE KEY UPDATE logins = logins + 1;

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


1
64+ बाइट प्राथमिक कुंजी एक महान सुझाव नहीं है
जॉन ब्लैक

'1' के स्थान पर एक चर काम का उपयोग करेगा? अर्थात् डुप्लीकेट कुंजी अद्यतन लॉगिन = लॉगिन + अंकलोगिन; (बिल्कुल सही ढंग से स्वरूपित)
मैट

1
ON DUPLICATE KEY UPDATEपूरी तरह से प्रतिकृति सुरक्षित नहीं है कि सावधान !
उसिल

2

आपने यह नहीं कहा कि आप क्या करने की कोशिश कर रहे हैं, लेकिन आपने इसे अन्य उत्तरों की टिप्पणियों में पर्याप्त रूप से इंगित किया है। मुझे लगता है कि आप शायद एक ऑटो वेतन वृद्धि कॉलम की तलाश कर रहे हैं

create table logins (userid int auto_increment primary key, 
  username varchar(30), password varchar(30));

तब डालने पर किसी विशेष कोड की आवश्यकता नहीं होती है। केवल

insert into logins (username, password) values ('user','pass');

जब आप क्लाइंट कोड में इस स्टेटमेंट को निष्पादित करते हैं तो MySQL एपीआई के पास यह बताने के लिए कार्य होते हैं कि उपयोगकर्ता क्या बनाया गया था।


2

मैं MySQL में विशेषज्ञ नहीं हूं, लेकिन आपको शायद इनसिक्योर उदाहरण जैसे ट्रिगर्स पर ध्यान देना चाहिए। ट्रिगर में आप अपनी मूल तालिका पर चुनिंदा क्वेरी चला सकते हैं और अगर यह कुछ पाया तो नए मान डालने के बजाय केवल पंक्ति 'लॉगिन' को अपडेट करें। लेकिन यह सब आपके द्वारा चलाए जा रहे MySQL के संस्करण पर निर्भर करता है।


2

यह और अधिक जवाब जो ऊपर के उपयोग का सुझाव के एक नंबर के लिए एक फुटनोट है ON DUPLICATE KEY UPDATE, सावधान कि यह नहीं हमेशा प्रतिकृति सुरक्षित है, इसलिए यदि आप कभी भी एक ही सर्वर से परे बढ़ रही पर योजना, तो आप इस से बचने और दो प्रश्नों का उपयोग करना चाहेंगे , एक अस्तित्व को सत्यापित करने के लिए, और फिर एक पंक्ति में मौजूद होने पर या जब ऐसा नहीं होता है तो दूसरा ।UPDATEINSERT

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