„Oracle“ rodinio atnaujinimo sąlyga - raktų išsaugotos lentelės (ORA-01779: negalima modifikuoti stulpelio, atitinkančio ne rakto vertės taupymo lentelę)

Oracle View Update Condition Key Preserved Tables Ora 01779



Praėjusią savaitę atlikęs rodinio atnaujinimą, padariau klaidą: ORA-01779: negalima modifikuoti stulpelio, atitinkančio ne rakto vertės išsaugojimo lentelę. Siekdamas išspręsti šią problemą, aš naršiau daugelio žmonių tinklaraščiuose ir dauguma jų tiesiog pateikė pavyzdį, nepasakę, kur yra esminė problema. Tik šiame tinklaraštyje labai giliai aptariama ši problema, galite ją perskaityti: Iš ORA-01752 klaidos pamatykite šio reiškinio esmę

ORA-01779 cannot modify a column which maps to a non key-preserved table



Raktas norint išspręsti šią problemą yra išsiaiškinti, kas yra raktų išsaugotos lentelės?





Pirmiau pateikiamas oficialaus dokumento paaiškinimas. Apytiksliai reiškia: supratimas apie išsaugotą raktą lentelę yra pagrindas suprasti kelių lentelių ryšio rodinių atnaujinimo sąlygas. Jei lentelė yra raktu išsaugota lentelė, sąlyga yra įvykdyta: kiekvienas jos pagrindinis raktas (arba unikalus raktas) yra ir pagrindinis rodinio raktas (arba unikalus raktas). Todėl sujungus kelias lenteles pagrindinis rakto išsaugotos lentelės raktas (arba unikalus raktas) bus išsaugotas.

Jei prijungsite emp ir dept per emp.deptno = dept.deptno, rezultatas bus toks:



Aukščiau pateiktame rodinyje emp yra raktu išsaugota lentelė, nes empno yra pagrindinis emp lentelės raktas, kuris yra ir pagrindinis ryšio rezultato raktas. Bet dept lentelė nėra raktu išsaugota lentelė, nes nors deptno yra pagrindinis dept lentelės raktas, tai nėra pagrindinis ryšio rezultato raktas.

Todėl, jei bandysite modifikuoti lentelės laukus ryšio rezultate, bus pranešta apie ORA-01779: stulpelio, atitinkančio ne rakto vertės taupymo lentelę, negalima pakeisti:

Modifikuojant emp lentelės laukus tai pavyks:

Dėl smalsumo išbandžiau kitus skirtingus apribojimus, tada įvyko mįslingas reiškinys:

Aš ką tik pridėjau vertę po ryšio sąlygos, o „emp“ tapo ne raktais išsaugota lentele. Ar raktuose išsaugotos lentelės turi būti sujungtos natūraliu ryšiu, ar savaime, ar išoriškai?