A rigor di termini, l'unico modo per sovrapporre valori del genere è utilizzare ON UPDATE CASCADE. Per fare questo , la colonna "is_deleted" deve far parte di un vincolo univoco.
Questo da solo non è troppo difficile. Se company.id è la tua chiave primaria, anche la coppia di colonne {id, is_deleted} sarà univoca. Un vincolo univoco su quella coppia di colonne ti consentirebbe di eseguire aggiornamenti a cascata tramite un riferimento di chiave esterna.
Ma non funzionerà nel tuo caso, perché è necessario consentire che i valori di riferimento siano diversi dai valori di riferimento.
Quindi, nel tuo caso, penso che tu abbia tre opzioni.
- Trigger
- Procedure archiviate
- Codice dell'applicazione
In tutti questi casi, devi prestare attenzione ai permessi (probabilmente revocando i permessi di eliminazione) e ai casi che possono evitare il tuo codice. Ad esempio, l'interfaccia della riga di comando dbms e l'interfaccia GUI possono essere utilizzate per aggirare i vincoli nel codice dell'applicazione e, a seconda delle autorizzazioni, nelle procedure memorizzate.