Operații privind ștergerea și actualizarea - funcții avansate ale cheilor externe - suport pentru chei străine

4.3. Operațiile DELETE și ON UPDATE

Clauzele ON DELETE și UPDATE ale cheilor externe sunt utilizate pentru a specifica acțiunile care trebuie efectuate atunci când ștergeți rândurile tabelului părinte (ON DELETE) sau modificați tasta părinte (ON UPDATE). Aceeași cheie străină poate avea diferite acțiuni specificate pentru ON DELETE și ON UPDATE. Acțiunile cheilor externe sunt similare în multe feluri cu declanșatoarele.







În baza de date SQLite, acțiunile ON DELETE și ON UPDATE asociate cu o cheie străină pot fi: NU ACȚIUNE, RESTRICT, SET NULL, SET DEFAULT sau CASCADE. Dacă acțiunea nu este specificată în mod specific, este implicit NO ACTION.

  • FĂRĂ ACȚIUNE. opțiunea "NO ACTION" (ACȚIUNE) înseamnă că atunci când cheia parentală este modificată sau șters din baza de date, nu sunt întreprinse acțiuni speciale.
  • RESTRICT. acțiunea «RESTRICT» constă în faptul că cererea nu poate elimina (pentru ON DELETE RESTRICȚIONA) sau o schimbare (pentru ON UPDATE RESTRICȚIONA) cheia părinte atunci când există una sau mai multe chei de conectarea la acesta filiale. Diferența dintre efectul RESTRICT acțiune și comportamentul obișnuit al cheii externe este că RESTRICȚIONA începe acțiune atunci când schimbă câmpul de înregistrare, și nu atunci când a completat cererea curentă, la fel ca în cazul restricțiilor imediate, și nu atunci când se termină tranzacția curentă, ca în cazul unei restricții amânate. Chiar dacă cheia externă a fost anunțată ca amânată în cazul în care acțiunea sa a fost declarată RESTRICT, un SQLite va genera un mesaj de eroare imediat, odată îndepărtat, sau a schimbat cheia părinte, care determină cheile copilului.
  • SET NULL. Dacă acțiunea este configurată ca «SET NULL», atunci când scoaterea cheii părinte (pentru ON DELETE SET NULL) sau schimbarea sa (pentru ON UPDATE SET NULL) copil coloane cheie sunt setate la o NULL valoare în toate rândurile din tabelul de copil, care se referă la un amovibil / rândul variabil al tabelului părinte.
  • SET DEFAULT. acțiunea SET DEFAULT este similară cu SET NULL cu excepția faptului că valoarea fiecărei coloane a cheii copil nu este setată la NULL, ci la valoarea implicită pentru acea coloană. Pentru informații despre modul în care sunt atribuite coloanele valorile implicite, consultați documentația detaliată pentru CREATE TABLE.
  • CASCADE. acțiunea "CASCADE" extinde operațiunile de ștergere și modificare a cheii părinte la copiii aflați în întreținere. Pentru acțiunea ON DELETE CASCADE, aceasta se exprimă prin faptul că fiecare rând din tabelul copil asociat cu rândul părinte care va fi șters va fi, de asemenea, șters. Pentru acțiunea ON UPDATE CASCADE, aceasta se exprimă prin faptul că valorile stocate în cheia copilului dependent vor fi înlocuite cu noile valori ale cheii părinte.






De exemplu, adăugați expresia "ON UPDATE CASCADE" așa cum se arată mai jos. Aceasta este o schemă îmbunătățită din exemplul din Capitolul 1, care permite utilizatorului să modifice coloana "artistid" (cheia parentală a cheii externe) fără a încălca integritatea referențială:

Setarea acțiunilor UPDATE sau ON DELETE nu înseamnă că nu trebuie să fie îndeplinită această constrângere a cheii străine.

Dacă, de exemplu, o acțiune ON DELETE SET DEFAULT, dar absent în rândul tabelă părinte care corespunde implicit a coloanei cheie fiica, îndepărtarea cheii părinte, pentru care există chei copilul aflat în întreținere, duce la o încălcare a unei chei străine. De exemplu:

Similar cu acele acțiuni SQLite care sunt marcate ca ON DELETE SET DEFAULT și demonstrat în exemplul de mai sus, următorul declanșator "AFTER DELETE" funcționează:

Ori de câte ori se șterge rândul tabelului părinte cu o cheie străină sau când se schimbă valorile stocate în coloanele cheii părinte, apare următoarea secvență logică a evenimentelor:

  1. Se execută programul de declanșare BEFORE.
  2. Restricțiile locale (nu o cheie străină) sunt verificate.
  3. Rândul tabelului părinte este actualizat sau șters.
  4. Se efectuează și alte acțiuni solicitate de cheia externă.
  5. Se pornește programul de declanșare AFTER.

Există o diferență semnificativă între acțiunea ON UPDATE a unei chei externe și declanșatoarele SQL. Acțiunea ON UPDATE va fi executată numai dacă valorile cheii părinte vor fi modificate astfel încât noile valori ale cheii părinte să nu fie echivalente cu cea veche. De exemplu:







Trimiteți-le prietenilor: