एकल पंक्ति में सम्मिलित कई पंक्तियों के लिए डुप्लीकेट कुंजी अद्यतन पर MySQL


199

मेरे पास एक SQL क्वेरी है जहां मैं एक क्वेरी में कई पंक्तियों को सम्मिलित करना चाहता हूं। इसलिए मैंने कुछ का उपयोग किया:

$sql = "INSERT INTO beautiful (name, age)
  VALUES
  ('Helen', 24),
  ('Katrina', 21),
  ('Samia', 22),
  ('Hui Ling', 25),
  ('Yumie', 29)";

mysql_query( $sql, $conn );

समस्या यह है कि जब मैं इस क्वेरी को निष्पादित करता हूं, तो मैं यह जांचना चाहता हूं कि क्या एक UNIQUEकुंजी (जो नहीं है PRIMARY KEY), उदाहरण के लिए 'name', ऊपर की जांच की जानी चाहिए और यदि ऐसा 'name'पहले से मौजूद है, तो संबंधित पूरी पंक्ति को अन्यथा डाला जाना चाहिए।

उदाहरण के लिए, नीचे दिए गए उदाहरण में, यदि 'Katrina'पहले से ही डेटाबेस में मौजूद है, तो पूरी पंक्ति, चाहे कितनी भी फ़ील्ड हो, अपडेट की जानी चाहिए। फिर से 'Samia'मौजूद नहीं होने पर, पंक्ति को सम्मिलित किया जाना चाहिए।

मैंने उपयोग करने के बारे में सोचा:

INSERT INTO beautiful (name, age)
      VALUES
      ('Helen', 24),
      ('Katrina', 21),
      ('Samia', 22),
      ('Hui Ling', 25),
      ('Yumie', 29) ON DUPLICATE KEY UPDATE

यहाँ जाल है। मैं फंस गया और उलझन में था कि कैसे आगे बढ़ना है। मेरे पास एक बार में कई पंक्तियाँ सम्मिलित / अपडेट करने के लिए हैं। कृपया मुझे एक दिशा दें। धन्यवाद।

जवाबों:


479

VALUESनए मानों ( दस्तावेज़ देखें ) को संदर्भित करने के लिए कीवर्ड का उपयोग करें ।

INSERT INTO beautiful (name, age)
    VALUES
    ('Helen', 24),
    ('Katrina', 21),
    ('Samia', 22),
    ('Hui Ling', 25),
    ('Yumie', 29)
ON DUPLICATE KEY UPDATE
    age = VALUES(age),
     ...

2
क्या होगा अगर हमें UPDATE में एक IF स्टेटमेंट शामिल करने की आवश्यकता है जिसमें प्रत्येक पंक्ति के लिए एक अलग शर्त हो?
तर्क

2
@logic: इससे संबंधित कई प्रश्न हैं: StackOverflow खोज । यदि उनमें से कोई भी आपके प्रश्न का उत्तर नहीं देता है, तो कृपया एक नया पोस्ट करके बताएं कि आपको क्या चाहिए।
पीटर लैंग

@ आपको अपने मुद्दे का कोई समाधान मिला? वर्तमान में मैं एक ही मुद्दे का सामना कर रहा हूँ
पार्थ खरेचा

शानदार सुझाव। यदि आप डुप्लिकेट होने पर कोई मान बढ़ाना चाहते हैं, तो "ON DUPLICATE KEY UPDATE" भाग के बाद इसे जोड़ें: कुल = कुल + मान (कुल)
फीनिक्स

1

INSERT INTO ... DUPLICATE KEY पर अपडेट केवल MYSQL के लिए काम करेगा, SQL सर्वर के लिए नहीं।

SQL सर्वर के लिए, इसके चारों ओर काम करने का तरीका पहले एक अस्थायी तालिका घोषित करना है, उस अस्थायी तालिका के लिए मान सम्मिलित करना है, और फिर उसका उपयोग करें

ऐशे ही:

declare @Source table
(
name varchar(30),
age decimal(23,0)
)

insert into @Source VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29);


MERGE beautiful  AS Tg
using  @source as Sc
on tg.namet=sc.name 

when matched then update 
set tg.age=sc.age

when not matched then 
insert (name, age) VALUES
(SC.name, sc.age);

15
हालांकि SQL सर्वर का उपयोग कौन करता है: D
जेरेमी बेलोलो

-3

आप उपयोग कर सकते हैं की जगह सम्मिलित करने के बजाय ... पर नकली चाबी अद्यतन।


28
हां, लेकिन नई पंक्ति सम्मिलित होने से पहले पुरानी पंक्ति को हटाकर पुरानी पंक्ति का उपयोग किया जाता है। मैं प्राथमिक आईडी बनाए रखने के लिए पुरानी पंक्ति को बनाए रखना चाहता हूं।
प्रशांत

2
मुझे एहसास नहीं था कि पुराने पीके को बनाए रखना आपके लिए किसी तरह से महत्वपूर्ण है ... निश्चित रूप से, इस मामले में REPLACE काम नहीं करेगा ...
a1ex07

4
पुनश्च: "में बदलें" दोनों को हटाने और विशेषाधिकार डालने की आवश्यकता होती है!
ओलिवर एम ग्रेच सेप

2
और उपर्युक्त डिलीट / इंसर्ट कारणों के लिए, इसके उदाहरणों में भी यह बहुत धीमा है।
रोस

1
यदि आप कुछ कॉलम अपडेट करना चाहते हैं तो क्या होगा? प्रतिस्थापन सभी को अपडेट करेगा।
imVJ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.