2011-01-16 16 views
15

मैं एक "जहां मौजूद नहीं है" के साथ एक सम्मिलित क्वेरी को गठबंधन करना चाहता हूं ताकि पीके बाधाओं का उल्लंघन न किया जा सके।मैं एक सम्मिलित कैसे कर सकता हूं जहां मौजूद नहीं है?

INSERT INTO myTable(columns...) 
VALUES(values...) 
WHERE NOT EXISTS 
    (SELECT * 
    FROM myTable 
    WHERE pk_part1 = value1, 
     AND pk_part2 = value2) 

मैं यह कैसे पूरा कर सकते हैं - हालांकि, वाक्य रचना निम्नलिखित रूप में इस तरह मुझे एक Incorrect syntax near the keyword 'WHERE' त्रुटि देता है?

(सामान्य तौर पर, आप एक डालने एक जहां खंड के साथ गठजोड़ कर सकते हैं?)

+1

यह MySQL है भी उपलब्ध है। मुझे यकीन नहीं है कि MySQL ऐसी उप-क्वेरी का समर्थन करेगा या नहीं। – Nishant

+0

@ निशांत - नहीं, माईएसक्ल नहीं, एक एसक्यूएल टैग है ... मैं स्पष्टता के लिए एक SQL सर्वर टैग जोड़ूंगा – froadie

+0

आपको एक संग्रहीत प्रक्रिया का उपयोग करना चाहिए और निम्न लिंक पर एक नज़र डालना चाहिए: http://weblogs.sqlteam.com /mladenp/archive/2007/07/30/60273.aspx –

उत्तर

18
INSERT INTO myTable(columns...) 
Select values... 
WHERE NOT EXISTS 
    (SELECT * 
    FROM myTable 
    WHERE pk_part1 = value1, 
     AND pk_part2 = value2) 

संपादित करें: मार्टिंस लिंक पढ़ना, तो स्वीकार करते हैं, कि सबसे अच्छा समाधान है के बाद:

BEGIN TRY 
    INSERT INTO myTable(columns...) 
    values(values...) 
END TRY 
BEGIN CATCH 
    IF ERROR_NUMBER() <> 2627 
     RAISERROR etc 
END CATCH; 
+2

यह अभी भी लोड के तहत डुप्लीकेट डालने का प्रयास कर सकता है। यदि ओपी 'मर्ज' का उपयोग कर SQL Server 2008 पर है, तो इस समस्या से बचाता है। –

+3

जैसा कि यहां बताया गया है http://stackoverflow.com/questions/3407857/only-inserting-a-row-if-its-not-already- कहीं भी –

+0

@ मार्टिन मुझे लगता है, मुझे इस उत्तर –

3

मूल्यों की एक अनूठी सूची रखने का सबसे आसान तरीका या तो ए) कॉलम (ओं) को प्राथमिक कुंजी के रूप में सेट करें या बी) कॉलम पर एक अद्वितीय बाधा उत्पन्न करें। इनमें से किसी एक के परिणामस्वरूप तालिका में पहले से मौजूद किसी चीज़ को मान डालने/अपडेट करने का प्रयास करते समय त्रुटि हो जाएगी, जब कोई EXISTS/etc चुपचाप विफल नहीं होगा - कोई त्रुटि नहीं, क्वेरी ठीक से निष्पादित हो जाएगी।

जिसके अनुसार, एक सम्मिलित करें का उपयोग/चयन (VALUES हिस्सा शामिल नहीं है):

INSERT INTO myTable(columns...) 
SELECT [statically defined values...] 
    FROM ANY_TABLE 
WHERE NOT EXISTS (SELECT NULL 
        FROM myTable 
        WHERE pk_part1 = value1 
         AND pk_part2 = value2) 
+0

यह एक पीके त्रुटि उत्पन्न करता है ... मैं यह सुनिश्चित करने के लिए उस त्रुटि से बचना चाहता हूं कि यह पहले – froadie

+0

@froadie है: मैं समझता हूं, लेकिन मैं सूचित करने में सक्षम होने के लिए लौटाई गई त्रुटि का उपयोग कर रहा हूं उपयोगकर्ता जो मान पहले से मौजूद है। –

+0

यदि टुपल मौजूद है तो निम्न त्रुटि उठाई गई: VALUES खंड में कम से कम एक तत्व होना चाहिए। खाली तत्वों की अनुमति नहीं है। –

-1

mysql डालने क्वेरी की उपेक्षा है: यदि आप कीवर्ड ध्यान न दें का उपयोग करते हैं

, त्रुटियों जो INSERT कथन निष्पादित करते समय होता है उसे चेतावनियों के रूप में माना जाता है। उदाहरण के लिए, IGNORE के बिना, एक पंक्ति जो मौजूदा यूनिक इंडेक्स या तालिका में प्राथमिक कुंजी मान को डुप्लिकेट करती है, डुप्लिकेट-कुंजी त्रुटि का कारण बनती है और कथन निरस्त हो जाता है। इग्नोर के साथ, पंक्ति अभी भी डाली नहीं गई है, लेकिन कोई त्रुटि जारी नहीं की गई है। आईजीएनओआर निर्दिष्ट नहीं होने पर डेटा रूपांतरण जो त्रुटियों को ट्रिगर करेंगे, कथन को रोक देंगे। IGNORE के साथ, अमान्य मान निकटतम मानों में समायोजित किए जाते हैं और डाले जाते हैं; चेतावनियां उत्पन्न की जाती हैं लेकिन बयान जारी नहीं होता है। आप mysql_info() सी एपीआई फ़ंक्शन के साथ निर्धारित कर सकते हैं कि वास्तव में तालिका में कितनी पंक्तियां डाली गई थीं।

http://dev.mysql.com/doc/refman/5.0/en/insert.html

पर नकली चाबी अद्यतन

संबंधित मुद्दे

 संबंधित मुद्दे