Ho letto questo sulla parola chiave SQL DEFERRABLE
in Database Systems - The Complete Book .
Quest'ultimo [NOT DEFERRABLE] è predefinito e significa che ogni volta che viene eseguita un'istruzione di modifica del database, il vincolo viene verificato immediatamente dopo, se la modifica potrebbe violare il vincolo della chiave esterna.
Tuttavia, se dichiariamo che un vincolo è DEFERRABILE , abbiamo la possibilità di farlo aspettare fino al completamento di una transazione prima di verificare il vincolo.
Seguiamo la parola chiave DIFFERIBILE con INIZIALMENTE DIFFERITO o INIZIALMENTE IMMEDIATO . Nel primo caso, il controllo verrà posticipato appena prima del commit di ogni transazione. In quest'ultimo caso, il controllo verrà effettuato immediatamente dopo ogni dichiarazione.
In che modo è NOT DEFERRABLE
diverso da DEFERRABLE INITIALLY IMMEDIATE
? In entrambi i casi, a quanto pare, eventuali vincoli vengono controllati dopo ogni singola istruzione.
DEFERRABLE
afferma l'intenzione del progettista che rinviare il vincolo sia un'azione utile o necessaria. Questo non è il caso per la stragrande maggioranza dei vincoli del database e l'etichettatura di tutto in quantoDEFERRABLE
perderebbe questa utile distinzione.