MySQL डालें कहां क्वेरी


121

इस प्रश्न में क्या गलत है:

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

यह WHEREक्लॉज के बिना काम करता है । मुझे लगता है कि मेरी एसक्यूएल भूल गया है ..

जवाबों:


237

MySQL INSERT सिंटैक्स WHERE क्लॉज का समर्थन नहीं करता है, क्योंकि आपकी क्वेरी के रूप में यह विफल हो जाएगा। मान लें कि आपका idकॉलम अद्वितीय या प्राथमिक कुंजी है:

यदि आप ID 1 के साथ एक नई पंक्ति सम्मिलित करने का प्रयास कर रहे हैं तो आपको उपयोग करना चाहिए:

INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);

यदि आप ID के साथ मौजूदा पंक्ति के लिए वजन / वांछित मानों को बदलने का प्रयास कर रहे हैं, तो आपको उपयोग करना चाहिए:

UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;

अगर आप चाहें तो INSERT का उपयोग भी कर सकते हैं .. DUPLICATE KEY सिंटैक्स पर जैसे:

INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

या यहां तक ​​कि ऐसा है:

INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

यह भी ध्यान रखना महत्वपूर्ण है कि यदि आपका idस्तंभ एक आटोइन्क्रिमेंट कॉलम है तो आप अपने INSERT से इसे एक साथ छोड़ सकते हैं और mysql को इसे सामान्य रूप में बढ़ा सकते हैं।


1
अच्छे उत्तर के लिए धन्यवाद। UPDATE का उपयोग करते समय इसके ठीक काम को क्वेरी करें। लेकिन, जब आईडी एक प्राथमिक कुंजी और ऑटो वेतन वृद्धि कुंजी है, तो उपरोक्त INSERT बयान काम नहीं करता है। कुंजी 1 के लिए डुप्लिकेट प्रविष्टि '1'।
JDGuide

1
@JDeveloper ऐसा इसलिए है क्योंकि पंक्ति पहले से मौजूद है। जैसा कि चाड ने If you're trying to insert a new row with ID 1 you should be usingINSERT INTO का उल्लेख किया है । आपके मामले में जब आप ID 1 डालने की कोशिश कर रहे हैं, तो यह पहले से मौजूद है और यह एक प्राथमिक या अद्वितीय कुंजी है और विफल रहता है, इसलिए आपको या तो UPDATE सिंटैक्स या INSERT का उपयोग करना चाहिए .. ON
DUPLATEATE

41

आप एक वाल्व खंड के साथ WHERE क्लॉज़ को संयोजित नहीं कर सकते। आपके पास दो विकल्प हैं जहां तक ​​मुझे जानकारी है-

  1. मूल्यों को निर्दिष्ट करना

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
  2. चयन कथन का उपयोग कर INSERT

    INSERT INTO Users(weight, desiredWeight) 
    SELECT weight, desiredWeight 
    FROM AnotherTable 
    WHERE id = 1

19

आप अद्यतन प्रश्नों के लिए WHERE क्लॉज का उपयोग करते हैं। जब आप INSERT करते हैं, तो आप मान रहे हैं कि पंक्ति मौजूद नहीं है।

ओपी का बयान तब बनेगा;

अद्यतन उपयोगकर्ता वजन = 160, वांछित = 45 जहां आईडी = 1;

MySQL में, यदि आप INSERT या UPDATE करना चाहते हैं, तो आप WHERE क्लॉज़ के साथ REPLACE क्वेरी का उपयोग कर सकते हैं। यदि मौजूद नहीं है, तो यह सम्मिलित है, अन्यथा यह अद्यतन करता है।

संपादित करें

मुझे लगता है कि बिल कारविन की बात महत्वपूर्ण है कि वह टिप्पणियों से बाहर आए और इसे स्पष्ट करें। धन्यवाद बिल, जब से मैंने MySQL के साथ काम किया है, तब तक बहुत समय हो चुका है, मुझे याद आया कि मेरे पास REPLACE के साथ समस्याएँ थीं, लेकिन मैं भूल गया कि वे क्या थे। मुझे इसे देखना चाहिए था।

ऐसा नहीं है कि MySQL का REPLACE कैसे काम करता है। यह एक DELETE करता है (यदि पंक्ति मौजूद नहीं है, तो INSERT द्वारा अनुसरण किया जा सकता है)। परिणाम दृष्टि के बारे में सोचो। ट्रिगर और विदेशी प्रमुख निर्भरताएँ। इसके बजाय, INSERT ... ON DUPLICATE KEY UPDATE का उपयोग करें।


7
ऐसा नहीं है कि MySQL का REPLACE कैसे काम करता है। यह एक DELETE करता है (यदि पंक्ति मौजूद नहीं है, तो INSERT द्वारा अनुसरण किया जा सकता है)। परिणाम दृष्टि के बारे में सोचो। ट्रिगर और विदेशी प्रमुख निर्भरताएँ। इसके बजाय, INSERT ... ON DUPLICATE KEY UPDATE का उपयोग करें।
बिल करविन


5

जहाँ कीवर्ड * क्वेरी डालें समर्थन नहीं करता

शर्तें लागू होती हैं क्योंकि आप उप-चयन कथनों के लिए स्थिति का उपयोग कर सकते हैं। आप उप-चयन का उपयोग करके जटिल आवेषण प्रदर्शन कर सकते हैं।

उदाहरण के लिए:

INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';

इंसर्ट स्टेटमेंट में "सिलेक्ट" करके, आप कई बार मल्टीपल इंसर्ट कर सकते हैं।

इस प्रकार की प्रविष्टि के साथ, आप सम्मिलित की जा रही पंक्तियों की संख्या की जाँच करना चाह सकते हैं। आप सम्मिलित करने से पहले निम्न SQL कथन को चलाकर पंक्तियों की संख्या निर्धारित कर सकते हैं।

SELECT count(*)
FROM customers
WHERE city = 'Newark';

आप यह सुनिश्चित कर सकते हैं कि आप EXISTS स्थिति का उपयोग करके डुप्लिकेट जानकारी न डालें।

उदाहरण के लिए, यदि आपके पास क्लाइंट की प्राथमिक कुंजी वाली क्लाइंट नाम की एक तालिका थी, तो आप निम्न कथन का उपयोग कर सकते हैं:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

यह कथन एक सबसेलेक्ट के साथ कई रिकॉर्ड सम्मिलित करता है।

यदि आप एक भी रिकॉर्ड सम्मिलित करना चाहते हैं, तो आप निम्नलिखित कथन का उपयोग कर सकते हैं:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

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

यह भी देखें कि किस खंड के साथ कैसे सम्मिलित किया जाए


4

इस प्रश्न का सही उत्तर इस प्रकार होगा:

ए)। अगर डालने से पहले चयन करना चाहते हैं:

INSERT INTO Users( weight, desiredWeight ) 
  select val1 , val2  from tableXShoulatNotBeUsers
  WHERE somecondition;

ख)। IF रिकॉर्ड पहले से ही डालने के बजाय अद्यतन का उपयोग करें:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

होना चाहिए

Update Users set weight=160, desiredWeight=145  WHERE id = 1;

सी)। यदि आप एक ही समय में अपडेट या सम्मिलित करना चाहते हैं

Replace Users set weight=160, desiredWeight=145  WHERE id = 1;

Note):- you should provide values to all fields else missed field in query 
        will be set to null

घ)। यदि आप SAME तालिका से रिकॉर्ड रिकॉर्ड करना चाहते हैं, तो बस याद रखें कि आप उस तालिका से चयन नहीं कर सकते हैं जिसमें आप इसलिए सम्मिलित कर रहे हैं

 create temporary table xtable ( weight int(11), desiredWeight int(11) ;

 insert into xtable (weight, desiredWeight) 
    select weight, desiredWeight from Users where [condition]

 insert into Users (weight, desiredWeight) 
    select weight , desiredWeight from xtable;

मुझे लगता है कि यह सुंदर परिदृश्यों को कवर करता है


3

जब आप INSERT स्टेटमेंट कर रहे हों, तब आप इसका उपयोग नहीं कर सकते हैं:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

होना चाहिए:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );

WHERE का हिस्सा केवल SELECT स्टेटमेंट में काम करता है:

SELECT from Users WHERE id = 1;

या अपडेट स्टेटमेंट्स में:

UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;

2

एक तालिका में पंक्तियों को जोड़ना = जोड़ना

अपेट = विशिष्ट पंक्तियों को अद्यतन करें।

आपके इंसर्ट में क्लॉज का वर्णन क्या होगा? यह मैच के लिए कुछ भी नहीं है, पंक्ति मौजूद नहीं है (अभी तक) ...


2

आप उपयोगकर्ता इनपुट के आधार पर सशर्त INSERT कर सकते हैं। यह क्वेरी तभी डालेगी जब इनपुट वर्जन '$ userWeight' और '$ userDesiredWeight' रिक्त न हों

INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';

1

यह उस स्थिति पर निर्भर करता है जिसमें INSERT वास्तव में एक खंड हो सकता है।

उदाहरण के लिए यदि आप किसी फॉर्म से मान मिलान कर रहे हैं।

Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com

समझ में नहीं आता है?


क्या यह संभव है जहां सम्मिलित विवरण में खंड
Taja_100

1

IF का उपयोग करने का सबसे सरल तरीका है कि आप अपने मुख्य अवरोध का उल्लंघन करें। यह केवल INSERT IGNORE के लिए काम करता है, लेकिन आपको INSERT में बाधा का उपयोग करने की अनुमति देगा।

INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');

1

उपरांत WHEREक्लॉज़ के आपने एक शर्त रखी, और इसका उपयोग डेटा लाने या पंक्ति को अद्यतन करने के लिए किया जाता है। जब आप डेटा सम्मिलित कर रहे हैं, तो यह माना जाता है कि पंक्ति मौजूद नहीं है।

तो, सवाल यह है कि क्या कोई पंक्ति है जिसकी आईडी 1 है? यदि हां, तो MySQL UPDATE का उपयोग करें , अन्यथा MySQL INSERT का उपयोग करें


1

यदि आप UPDATEस्टेटमेंट के बजाय स्टेटमेंट का उपयोग करने के लिए डेटा को बेहतर तरीके से सम्मिलित करने के लिए कोई विशेष रिकॉर्ड नहीं निर्दिष्ट कर रहे हैं INSERT

इस प्रकार की क्वेरी आपने प्रश्न में लिखी है, एक डमी क्वेरी की तरह है।

आपका प्रश्न है: -

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

यहां, आप आईडी = 1 को निर्दिष्ट कर रहे हैं, इसलिए बेहतर है कि आप UPDATEमौजूदा रिकॉर्ड को अपडेट करने के लिए स्टेटमेंट का उपयोग करें। यह सलाह नहीं दी जाती है WHEREकि INSERTआप के मामले में क्लॉज का उपयोग करें । आपको उपयोग करना चाहिए।UPDATE । । आपको ।

अब अपडेट क्वेरी का उपयोग करना: -

UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;

कोई भी mate.1st क्वेरी नहीं चलेगी। क्वेरी से कोई प्रश्न नहीं पूछा जाता है।
JDGuide

आप इन्सर्ट पर अपडेट का सुझाव क्यों दे रहे हैं? उपयोगकर्ता शर्त के साथ मान सम्मिलित करना चाहता है और बाहर निकलने के रिकॉर्ड को अद्यतन नहीं करता है।
सोमनाथ मुलुक ०

1

क्या वास्तव में किसी भी मामले में INSERT-INTO-VALUES के साथ WH-clause का उपयोग किया जा सकता है?

उत्तर निश्चित रूप से नहीं है।

INSERT INTO ... VALUES ... के बाद WHERE क्लॉज जोड़ना अमान्य SQL है, और पार्स नहीं होगा।

MySQL द्वारा दी गई त्रुटि है:

mysql> INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 1' at line 1

त्रुटि संदेश का सबसे महत्वपूर्ण हिस्सा है

... syntax to use near 'WHERE id = 1' ...

जो विशिष्ट हिस्से को दिखाता है कि पार्सर को यहां खोजने की उम्मीद नहीं थी: जहां क्लॉज है।


1

इसका योग गलत है। INSERT QUERY में WHERE क्लॉज नहीं है, केवल UPDATE QUERY है। अगर आप डेटा कहाँ जोड़ना चाहते हैं तो आईडी = 1 तो आपका प्रश्न होगा

UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1;

1

जहाँ तक मैं जानता हूँ कि आप इस क्वेरी में WHERE क्लॉज़ नहीं जोड़ सकते। शायद मैं अपनी एसक्यूएल भी भूल गया हूं, क्योंकि मुझे वास्तव में यकीन नहीं है कि आपको इसकी आवश्यकता क्यों है।


1

इंसर्ट स्टेटमेंट में आपको कहां इस्तेमाल नहीं करना चाहिए। यदि आप करना चाहते हैं, तो अपडेट स्टेटमेंट में इन्सर्ट का उपयोग करें और फिर किसी मौजूदा रिकॉर्ड को अपडेट करें।

वास्तव में मैं जान सकता हूँ कि आपको इन्सर्ट स्टेटमेंट में एक क्लॉज़ की आवश्यकता क्यों है ??

शायद इस कारण के आधार पर मैं आपको एक बेहतर विकल्प सुझा सकता हूँ।


1

मुझे लगता है कि आपका सबसे अच्छा विकल्प INSERT के बजाय REPLACE का उपयोग करना है

REPLACE INTO उपयोगकर्ता (आईडी, वजन, वांछित) VALUES (1, 160, 145);


1

इस तरह से पढ़ें

इसका कोई मतलब नहीं है ... यहां तक ​​कि सचमुच

INSERTका मतलब है एक जोड़ने के लिए new rowऔर जब आप कहते हैं कि WHEREआप परिभाषित करते हैं कि आप किस पंक्ति के बारे में बात कर रहे हैं SQL

तो एक मौजूदा पंक्ति पर एक शर्त के साथ एक नई पंक्ति जोड़ना संभव नहीं है।

आपको निम्नलिखित में से चुनना होगा:

ए के UPDATEबजाय का उपयोग करेंINSERT

B. क्लॉज का उपयोग करें INSERTऔर निकालें WHERE(मैं सिर्फ यह कह रहा हूं ...) या यदि आप उपयोग करने के लिए बाध्य हैं INSERTऔर WHEREएक ही बयान में इसे केवल INSERT..SELECT क्लॉज के माध्यम से किया जा सकता है ...

INSERT INTO Users( weight, desiredWeight ) 
SELECT FROM Users WHERE id = 1;

लेकिन यह एक पूरी तरह से अलग उद्देश्य प्रदान करता है और अगर आपने आईडी को प्राथमिक कुंजी के रूप में परिभाषित किया है तो यह प्रविष्टि विफल हो जाएगी, अन्यथा एक नई पंक्ति = 1 के साथ डाली जाएगी।


हाँ, आपकी बात सही है, इन सभी बातों को जानकर गलती हो जाती है।
आशा जॉर्ज

1

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मुझे उम्मीद है कि यह अभी भी किसी न किसी की मदद करेगा, जो मुझे आशा है कि एक सरल उदाहरण है:

पृष्ठभूमि:

मेरे पास कई मामलों में एक था: एक ही उपयोगकर्ता को कई बार कई मूल्यों के साथ सूचीबद्ध किया जाता है और मैं एक नया रिकॉर्ड बनाना चाहता था, इसलिए UPDATE को मेरे मामले में कोई मतलब नहीं होगा और मुझे किसी विशेष उपयोगकर्ता को संबोधित करने की आवश्यकता थी जैसे मैं करूंगा WHERE क्लॉज का उपयोग करना।

INSERT into MyTable(aUser,aCar)
value(User123,Mini)

इस निर्माण का उपयोग करके आप वास्तव में एक विशिष्ट उपयोगकर्ता (user123, जिनके पास अन्य रिकॉर्ड हैं) को लक्षित करते हैं, इसलिए आपको वास्तव में एक खंड, Ickon की आवश्यकता नहीं है।

उत्पादन हो सकता है:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore

1

INSERT और WHERE का उपयोग करने का एक तरीका है

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); इस मामले में एक अस्तित्व-परीक्षण की तरह ist। यदि आप इसे दो या अधिक बार चलाते हैं तो कोई अपवाद नहीं है ...


0

पोस्ट विधि का उपयोग करके mysql डालने के लिए सही वाक्यविन्यास है:

$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";

1
आपको उपयोगकर्ता के रूप में अविश्वसनीय मानदंड से बचने या किसी हमलावर को मनमाने ढंग से SQL कमांड को इंजेक्ट करने से रोकने के लिए पैरामीटर किए गए प्रश्नों का उपयोग करने की आवश्यकता है । और पासवर्ड को स्टोर करने के लिए HashCrypt एल्गोरिदम में से एक का उपयोग करें।
हेंड्रिक ब्रम्मनमैन

0

मुझे नहीं लगता कि हम सम्मिलित कथन में खंड का उपयोग कर सकते हैं


0
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';

1
क्या आप यह प्रस्तावित करता है कि यह क्या करता है और यह ओपी को कैसे संबोधित करता है?
Ro Yo Mi

0

आप INSERT और WHERE का एक साथ उपयोग नहीं कर सकते। आप नीचे दिए गए कोड जैसे विशेष क्षेत्र में विशेष कॉलम में मूल्य जोड़ने के लिए UPDATE क्लॉज का उपयोग कर सकते हैं;

UPDATE Users
SET weight='160',desiredWeight ='145'  
WHERE id =1

0

मुझे लगता है कि एक निर्दिष्ट पंक्ति पर एक मूल्य सम्मिलित करने का सही रूप है:

UPDATE table SET column = value WHERE columnid = 1

यह काम करता है, और यदि आप Microsoft SQL सर्वर पर लिखते हैं तो यह समान है

INSERT INTO table(column) VALUES (130) WHERE id = 1;

mysql पर आपको टेबल अपडेट करना होगा।


0

आप नीचे दिए गए कोड के साथ ऐसा कर सकते हैं:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.