खोज…


परिचय

व्यापक गलतफहमी (एसओ पर सहित) के विपरीत, ओरेकल जुड़ने के माध्यम से अपडेट की अनुमति देता है। हालांकि, कुछ (बहुत तार्किक) आवश्यकताएं हैं। हम उदाहरण देते हैं कि क्या काम नहीं करता है और एक सरल उदाहरण के माध्यम से क्या होता है। उसी को प्राप्त करने का एक और तरीका MERGE स्टेटमेंट है।

उदाहरण: क्या काम करता है और क्या नहीं

create table tgt ( id, val ) as 
  select 1, 'a' from dual union all
  select 2, 'b' from dual
;

Table TGT created.

create table src ( id, val ) as 
  select 1, 'x' from dual union all
  select 2, 'y' from dual
;

Table SRC created.

update
  ( select t.val as t_val, s.val as s_val
    from   tgt t inner join src s on t.id = s.id
  )
set t_val = s_val
;

SQL Error: ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 -  "cannot modify a column which maps to a non key-preserved table"
*Cause:    An attempt was made to insert or update columns of a join view which
           map to a non-key-preserved table.
*Action:   Modify the underlying base tables directly.

कल्पना करें कि अगर src.val लिए अलग-अलग मानों के साथ कॉलम src.id में हमारा मान 1 है, तो क्या होगा। जाहिर है, अपडेट का कोई मतलब नहीं होगा (किसी भी डेटाबेस में - यह एक तार्किक मुद्दा है)। अब, हम जानते हैं कि src.id में कोई डुप्लिकेट नहीं हैं, लेकिन Oracle इंजन को यह पता नहीं है - इसलिए यह शिकायत कर रहा है। शायद यही कारण है कि इतने सारे चिकित्सकों का मानना है कि ओरेकल "ज्वाइन के साथ अद्यतन नहीं है"?

Oracle क्या उम्मीद करता है कि src.id अद्वितीय होना चाहिए, और यह कि, Oracle, को पहले से पता होगा। आसानी से तय! ध्यान दें कि एक ही कंपोज़िट कुंजियों (एक से अधिक कॉलम पर) के साथ काम करता है, यदि अपडेट के लिए मिलान को एक से अधिक कॉलम का उपयोग करने की आवश्यकता होती है। व्यवहार में, src.id PK हो सकता है और tgt.id इस PK की ओर इशारा करते हुए FK हो सकता है, लेकिन यह जुड़ने के साथ अद्यतन के लिए प्रासंगिक नहीं है; क्या प्रासंगिक है अद्वितीय बाधा है।

alter table src add constraint src_uc unique (id);

Table SRC altered.

update
  ( select t.val as t_val, s.val as s_val
    from   tgt t inner join src s on t.id = s.id
  )
set t_val = s_val
;

2 rows updated.

select * from tgt;

ID  VAL
--  ---
 1  x
 2  y

वही परिणाम एक MERGE स्टेटमेंट (जो अपने स्वयं के दस्तावेज़ीकरण लेख के योग्य है) के साथ प्राप्त किया जा सकता है, और मैं व्यक्तिगत रूप से इन मामलों में MERGE को पसंद करता हूं, लेकिन इसका कारण यह नहीं है कि "Oracle जुड़ने के साथ अपडेट नहीं करता है।" जैसा कि इस उदाहरण से पता चलता है, ओरेकल जॉइन अपडेट के साथ करता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow