Vastus: DEFERRABLE INITIALLY DEFERRED kitsenduse definitsioonis tähendaks seda, et kitsenduse kontroll lükkub transaktsiooni lõppu - transaktsioon võib sisaldada mitut andmemuudatust, transaktsiooni käigus võivad muudatused olla kitsendusega vastuolus, kuid kui transaktsiooni lõpuks on andmed kitsendusega kooskõlas, siis andmebaasisüsteem ei tee sellest numbrit. Vaikimisi (NOT DEFERRABLE omadus) kontrollib PostgreSQL kitsenduse täidetust kas iga rea muutmise järel (NOT NULL, CHECK, PRIMARY KEY, UNIQUE kitsendused) või andmete muutmise lause täitmise järel (FOREIGN KEY, EXCLUDE kitsendused).
Artiklis
Deferrable SQL Constraints in Depth tuuakse PostgreSQL näitel välja olukorrad, millal DEFFERRABLE kitsendusi kasutada ja millal mitte.
DEFERRABLE kitsenduste kasutamise näidete hulgas on:
- andmete lisamine tabelitesse, mis kohustuslikke välisvõtmeid kasutades viitavad üksteisele (minu arvates peaks siinkohal üle vaatama andmebaasi struktuuri),
- eksklusiivsete ressursside ümberjagamine rühmade vahel (iga ressurss saab olla seotud vaid ühe rühmaga),
- unikaalsete järjekorranumbrite muutmine (parem lahendus võiks olla ujukomaarvude kasutamine järjekorranumbritena),
- andmete uude andmebaasi laadimise mugavamaks tegemine.
DEFERRABLE kitsenduste probleemid on:
- selline kitsenduse omadus võib takistada andmebaasisüsteemil kasutada seda kitsendust päringu optimeerimisel ja seega suurendada päringu täitmiseks kuluvat aega (siin on näide selle kohta Oracles),
- keerulisem silumine.
Veel võib esile tõsta ülekantavuse. Näiteks saab kitsenduse täitmise kontrolli lükata transaktsiooni lõppu:
- Oracle 12c kõigi kitsenduse tüüpide puhul,
- PostgreSQL 14 ei saa CHECK ja NOT NULL kitsenduste puhul,
- MySQL 8 ei saa ühegi kitsenduse tüübi puhul.