2010-06-25 13 views
7

मैं कुछ कोड के साथ काम कर रहा हूं। ऐसे कई प्रश्न हैं जिनके प्रभाव हैं, यदि पंक्ति भरने वाले कुछ डेटा के साथ पंक्ति मौजूद है, तो उस पंक्ति को शेष डेटा के साथ अपडेट किया गया है, और यदि पंक्ति मौजूद नहीं है, तो एक नया बनाया गया है। वे इस तरह दिखेगा:यह SQL क्वेरी मौजूद होने पर पंक्ति को अद्यतन करने के लिए कैसे क्वेरी करती है, या यदि नहीं, तो कार्य करें?

 
INSERT INTO table_name (col1, col2, col3) 
SELECT %s AS COL1, %s AS COL2, %s AS COL3 
FROM (SELECT %s AS COL1, %s AS COL2, %s AS COL3) A 
LEFT JOIN table_name B 
ON B.COL1 = %s 
AND B.COL2 = %s  --note: doesn't mention all columns here 
WHERE B.id IS NULL 
LIMIT 1 

मैं इस पैटर्न की नकल कर सकते हैं और यह काम करने लगता है, लेकिन मैं क्या वास्तव में पर्दे के पीछे चल रहा है के रूप में उलझन में हूँ। क्या कोई यह स्पष्ट कर सकता है कि यह वास्तव में कैसे काम करता है? मैं PostgreSQL का उपयोग कर रहा हूँ।

उत्तर

3

आप यह सुनिश्चित करें कि अद्यतन करने है कर रहे हैं केवल कोड के उस टुकड़े का उपयोग कर?

खुशी क्या है कि आप table_name (तालिका को नए रिकॉर्ड डालने के लिए तालिका) के साथ शामिल हो रहे हैं और केवल उन पंक्तियों के लिए फ़िल्टरिंग कर रहे हैं जो उस तालिका में मौजूद नहीं हैं। (जहां बीआईडी ​​एनयूएलएल है)

ऐसा करना "अस्तित्व में नहीं है", केवल एक अलग तरीके से करना है।

मुझे आशा है कि मेरा उत्तर आपकी मदद कर सकता है।

सम्मान।

+0

आह तो यह वास्तव में एक प्रविष्टि को अद्यतन नहीं करेगा जो पहले से मौजूद है? यह सिर्फ यह सुनिश्चित कर रहा है कि डुप्लिकेट पंक्तियां नहीं बनाई गई हैं? – Claudiu

+0

यूप, जहां खंड केवल यह सुनिश्चित करने के लिए है कि कोई डुप्लिकेशन नहीं है। –

+0

इस बनाम कुछ करने के लिए यहां कोई अंतर है जैसे: 'table_name (col1, col2, col3) में INSERT चुनें% s,% s,% s चुनें जहां मौजूद नहीं है (चुनें * table_name से T के रूप में T.col1 =% एस और टी.col2 =% एस) '? – Claudiu

1

बाएं जॉइन/आईएस नल का मतलब है कि क्वेरी उन रिकॉर्डिंग को दर्ज कर रही है जो पहले से मौजूद नहीं हैं। यही कारण है कि तालिका सम्मिलित करें खंड पर परिभाषित संभालने बायाँ शामिल होने के खंड में एक के रूप में एक ही है - सार संक्षेप के बारे में सावधान ...

मुझे पता है कि क्या %s है इच्छुक हूँ

+0

मुझे संदेह है कि यह एक 'sprintf()' के लिए प्रारूप स्ट्रिंग है - जैसे फ़ंक्शन, और '% s' को एसबीएल को डीबीएमएस को भेजे जाने से पहले किसी प्रकार के नाम या मूल्य के साथ प्रतिस्थापित किया जाएगा। –

+0

हाँ,% s डेटा है (आप इस उदाहरण के लिए "foo", "bar", "baz" मान सकते हैं) तालिका में डालने के लिए। – Claudiu