के लिए प्राथमिक कुंजी उल्लंघन में DISTINCT परिणामों का चयन करें मुझे कुछ अन्य समस्याओं से डेटा को थोक में डालने में कुछ समस्याएं थीं।INSERT INTO/SEST_CT
CREATE TABLE TEST_T (
T_GUID RAW(16) DEFAULT SYS_GUID() NOT NULL,
T_VAL1 NUMBER(10) NOT NULL,
T_VAL2 VARCHAR2(10) NOT NULL,
PRIMARY KEY (T_GUID)
)
बयान के सरलीकृत संस्करण मैं डेटा के साथ भरने के लिए इरादा:
INSERT INTO TEST_T (T_VAL1, T_VAL2)
SELECT DISTINCT
CAST(SUBSTR(zip_code, 1,1) AS NUMBER) as t_val1,
zip_code as t_val2
FROM OTHER_TABLE_T
WHERE ...
ORDER BY t_val1
मैं प्रदान नहीं कर रहा हूँ के रूप में एक T_GUID
मूल्यवान, मैं मान लिया गया है होगा लक्ष्य इस तरह कुछ हद तक देखा कि मुझे प्रत्येक नई लाइन के लिए SYS_GUID
फ़ंक्शन द्वारा प्रदान किया गया एक मिलता है। लेकिन कुछ गलत हो रहा है, और मुझे प्राथमिक कुंजी के लिए एक विशिष्टता बाधा उल्लंघन मिलता है।
यदि मैं DISTINCT
हटा देता हूं, तो कथन सफल होता है, लेकिन मुझे बहुत सारी डुप्लिकेट प्रविष्टियां मिलती हैं। और, ज़ाहिर है, अगर मैं स्पष्ट रूप से SYS_GUID()
को अपने SELECT
में कॉल करता हूं, तो इसका बिल्कुल वही परिणाम होता है।
अब मैंने पाया कि अगर मैं बस मेरा चारों ओर एक और SELECT
शब्दों में कहें, यह ठीक से काम करता है, कोई बाधा के उल्लंघन और अलग पंक्तियों डाला हो:
INSERT INTO ...
SELECT x.* FROM (
SELECT DISTINCT ...
) x
तो जहां डुप्लिकेट GUIDs से आते हैं? यदि पंक्तियों के पूर्ण सेट में कोई समस्या नहीं है, तो अलग कारणों के कारण पंक्तियों को क्यों हटाया जाएगा? चूंकि SYS_GUID प्रत्येक कॉल के लिए एक अद्वितीय पहचानकर्ता बनाता है, मैं केवल कल्पना कर सकता हूं कि अलग-अलग मामले में इसे केवल पूरे खंड के लिए बुलाया जाता है, जिसे आस-पास के रैपिंग SELECT
द्वारा हल किया जाता है। अगर कोई समझ सकता है कि उस मामले में निष्पादन कैसे भिन्न होता है तो मैं बहुत खुश हूं।
क्या आप वाकई guids डुप्लिकेट हैं कर रहे हैं? उन पर बहुत बारीकी से देखो, वे समान दिखते हैं लेकिन आपको उनमें से प्रत्येक में कम से कम एक चरित्र को ध्यान में रखना चाहिए। – GriffeyDog
आपका कोड सही दिखता है। आप ओरेकल बग को मार रहे हैं, देखो "एईक्स पर उत्पन्न डिप्लीकेट SYS_GUID मेरे ओरेकल सपोर्ट पर एनक्यू [आईडी 1371805.1]" के दौरान ओआरए -1 त्रुटियों का कारण बन सकता है। –