Qual è lo scopo di SET NULL nei vincoli Elimina / Aggiorna chiavi esterne?


15

Probabilmente ho una mentalità ristretta, ma se creo un vincolo di chiave esterna e una riga viene aggiornata o eliminata, perdo quella connessione se la colonna della tabella figlio viene impostata su NULL.

Qual è lo scopo di mantenere intenzionalmente queste file orfane?


Sto cercando casi d'uso e non credo che siano specifici del database (potrebbe essere sbagliato qui)
Derek Downey,

Risposte:


13

Il fatto che set nullsia utile o meno dipende da ciò che hai scelto nulldi significare nel particolare contesto, con tutta la confusione e l'opinione in circolazionenull all'IMO l'approccio ragionevole è che il DBA

  1. Scegli (e documenta) cosa significa per ogni campo annullabile
  2. Assicurati che significhi solo una cosa

Con tali regole, considerare il seguente caso d'uso:

  • Hai un "negozio" da tavolo (ad es. Singoli locali)
  • Hai una tabella "rivenditore" (ad es. Catene)
  • La tabella "negozio" ha un campo di ricerca che si riferisce alla chiave di "rivenditore"
  • Hai definito nullper rappresentare un negozio indipendente (ovvero uno che non fa parte di una catena)
  • Un "rivenditore" chiude le filiali al punto da considerare i suoi negozi indipendenti

In questo caso, ha un on delete set nullsenso. Esistono altri modi per modellare queste regole aziendali, ma questa è la più semplice e se si adatta perfettamente ai fatti che ti interessano nel mondo reale, suggerisco che sia perfettamente ok


Aspetti positivi con un significato rigoroso di null e con il tuo esempio è chiaro perché questa è una funzionalità.
Derek Downey,

1

La maggior parte dei casi d'uso a cui riesco a pensare in genere sono nella forma "Beh, potremmo fare qualcosa di diverso ma invece ci sentivamo come fare questo".

Prendi in considerazione un ownercampo per un bug in un sistema di tracciamento dei problemi di un'azienda. Se John smette, sicuramente tutti i suoi problemi non dovrebbero essere semplicemente eliminati quando il suo account viene rimosso. Anche in questo caso, alcuni database consentono SET DEFAULTcome azione (o se un trigger esegue la stessa attività) e avere un Nobodydipendente come proprietario predefinito dei problemi potrebbe essere un'opzione. Oppure potremmo avere un disabledcampo per John piuttosto che cancellare il suo record.


3
In questo caso, direi di non consentire l'eliminazione ( RESTRICT), se non altro per indicare la colpa a un vecchio dipendente quando qualcosa va storto!
Derek Downey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.