Oracle Database
जोड़ों के साथ अद्यतन करें
खोज…
परिचय
उदाहरण: क्या काम करता है और क्या नहीं
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 जुड़ने के साथ अपडेट नहीं करता है।" जैसा कि इस उदाहरण से पता चलता है, ओरेकल जॉइन अपडेट के साथ करता है।