Qual é o objetivo de SET NULL nas restrições de Excluir / Atualizar Chaves Estrangeiras?

15

Provavelmente estou com uma mente estreita, mas se eu criar uma restrição de chave estrangeira e uma linha for atualizada ou excluída, perderei essa conexão se a coluna da tabela filho for definida como NULL.

Qual é o objetivo de manter intencionalmente essas linhas órfãs?

Derek Downey
fonte
Estou à procura de casos de uso, e eu não acho que eles específica de banco de dados está (pode estar errado aqui)
Derek Downey
Eu nunca vi um caso de uso para isso também ...
a_horse_with_no_name

Respostas:

13

Se set nullé útil ou não, depende do que você escolheu nullsignificar em um contexto específico - com toda a confusão e opinião em torno da nullIMO, a abordagem sensata é que o DBA

  1. Escolha (e documente) o que isso significa para cada campo anulável
  2. Certifique-se de que isso significa apenas uma coisa

Com essas regras, considere o seguinte caso de uso:

  • Você tem uma 'loja' de mesa (por exemplo, instalações individuais)
  • Você tem uma tabela 'varejista' (por exemplo, cadeias)
  • A tabela 'shop' possui um campo de pesquisa referente à chave de 'varejista'
  • Você definiu nullpara representar uma loja independente (ou seja, uma que não faz parte de uma cadeia)
  • Um 'varejista' fecha filiais a tal ponto que você considera suas lojas independentes

Nesse caso, um on delete set nullfaz sentido. Existem outras maneiras de modelar essas regras de negócios, mas essa é a mais simples e se ela se encaixa com precisão nos fatos de que você se importa no mundo real, sugiro que esteja perfeitamente ok

Jack Douglas
fonte
Bons pontos com um significado estrito de null e, com o seu exemplo, fica claro por que esse é um recurso.
Derek Downey
1

A maioria dos casos de uso em que consigo pensar geralmente tem a forma "Bem, poderíamos fazer algo diferente, mas sentimos vontade de fazer isso".

Considere um ownercampo para um bug em um sistema de rastreamento de problemas em uma empresa. Se John sair, certamente todos os seus problemas não devem ser excluídos simplesmente quando sua conta for removida. Mesmo assim, alguns bancos de dados permitem SET DEFAULTcomo uma ação (ou um gatilho executa a mesma tarefa), e ter um Nobodyfuncionário como proprietário padrão de problemas pode ser uma opção. Ou poderíamos ter um disabledcampo para John em vez de excluir seu registro.

DerfK
fonte
3
Nesse caso, eu argumentaria para não permitir exclusões ( RESTRICT), se por nenhum outro motivo isso culpar um funcionário antigo quando algo der errado com ele!
Derek Downey