Oracle-näkymän päivitysehto-avainsäilytetyt taulukot (ORA-01779: Ei voida muuttaa saraketta, joka vastaa ei-avaimen arvon säästötaulukkoa)

Oracle View Update Condition Key Preserved Tables Ora 01779



Kun tein näkymän päivityksen viime viikolla, tein virheen: ORA-01779: Ei voida muuttaa saraketta, joka vastaa ei-avaimen arvon tallennustaulukkoa. Tämän ongelman ratkaisemiseksi olen selannut monien ihmisten blogeja, ja suurin osa heistä antoi vain esimerkin sanomatta, missä olennainen ongelma on. Vain tämä blogi käsittelee asiaa hyvin syvällisesti, voit lukea sen: Katso ORA-01752 -virheestä ydin ilmiön läpi

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



Avain tämän ongelman ratkaisemiseen on selvittää, mikä on avainsäilytetyt taulukot?





Edellä on virallisen asiakirjan selitys. Karkeasti tarkoittaa: Avaimella säilytetyn taulukon ymmärtäminen on perusta monitaulukkoisten yhteysnäkymien päivitysolosuhteiden ymmärtämiselle. Jos taulukko on avaimella säilytetty taulukko, ehto täyttyy: kukin sen ensisijainen avain (tai yksilöllinen avain) on myös näkymän ensisijainen avain (tai yksilöllinen avain). Siksi avaimella säilytetyn taulukon ensisijainen avain (tai yksilöllinen avain) säilyy useiden taulukoiden yhdistämisen jälkeen.

Jos yhdistät emp ja dept emp.deptno = dept.deptno kautta, tulos on:



Yllä olevassa näkymässä emp on avaimella säilytetty taulukko, koska empno on emp-taulukon ensisijainen avain, joka on myös yhteystuloksen ensisijainen avain. Mutta osastotaulukko ei ole avaimessa säilytetty taulukko, koska vaikka deptno on osastotaulukon ensisijainen avain, se ei ole yhteystuloksen ensisijainen avain.

Siksi, jos yrität muokata yhteystuloksen osastotaulukon kenttiä, ORA-01779 raportoidaan: Ei-avainarvoa säästävää taulukkoa vastaavaa saraketta ei voi muokata:

Kun muokataan emp-taulukon kenttiä, se onnistuu:

Uteliaisuuden takia kokeilin muita erilaisia ​​rajoituksia, ja sitten tapahtui hämmentävä ilmiö:

Lisäsin juuri arvon yhteyden ehdon jälkeen, ja empistä tuli taulukko, joka ei ole avaimia. Pitääkö avaimella säilytetyt pöydät yhdistää luonnollisella liitännällä vai itseliitännällä vai ulkoisella yhteydellä?