Não desenho esquemas todos os dias, mas quando o faço, tento configurar as atualizações / exclusões em cascata corretamente para facilitar a administração. Entendo como as cascatas funcionam, mas nunca consigo me lembrar de qual tabela é qual.
Por exemplo, se eu tiver duas tabelas - Parent
e Child
- com uma chave estrangeira nessas Child
referências Parent
e tiver ON DELETE CASCADE
, quais registros acionam uma cascata e quais são excluídos pela cascata? Meu primeiro palpite seria que os Child
registros sejam excluídos quando os Parent
registros forem excluídos, pois os Child
registros dependem dos Parent
registros, mas isso ON DELETE
é ambíguo; isso pode significar excluir o Parent
registro quando o Child
registro for excluído ou pode excluir o Child
registro quando ele Parent
for excluído. Então qual é?
Eu gostaria que a sintaxe fosse ON PARENT DELETE, CASCADE
, ON FOREIGN DELETE, CASCADE
ou algo semelhante, para remover a ambiguidade. Alguém tem alguma mnemônica para lembrar disso?
fonte
Order(custID, itemID, orderID)
ondecustID
refere-se a uma chave primária naCustomers
tabela eitemID
refere-se a uma chave primária naItems
tabela. Não vaiOrder
ter dois pais?ON DELETE CASCADE é uma cláusula opcional em uma declaração de chave estrangeira. O mesmo acontece com a declaração de chave estrangeira. (Significado, na tabela "filho").
Uma maneira de interpretar uma declaração de chave estrangeira é: "Todos os valores válidos para esta coluna vêm de 'that_column' em 'that_table'." Quando você exclui uma linha da tabela "filho", ninguém se importa. Não afeta a integridade dos dados.
Quando você exclui uma linha da tabela "pai" - de "essa tabela" - você remove um valor válido dos valores possíveis para a tabela "filho". Para manter a integridade dos dados, você deve fazer algo na tabela "filho". Exclusões em cascata é uma coisa que você pode fazer.
fonte
SQL: 2011 Especificações
Existem cinco opções para
ON DELETE
, eON UPDATE
que podem ser aplicadas aoFOREIGN KEY
. Eles são chamados<referential actions>
diretamente da especificação SQL: 2011A chave estrangeira estabelece o relacionamento dependente. O
<referential action>
determina o que acontece quando o relacionamento é dissolvido.Exemplo / Metáfora / Explicação
Para este exemplo, aceitaremos o modelo comum de sociedade e economia: onde toda
business
empresa é uma empresa que mantém um relacionamento com obourgeoisie
meio afatcat_owner
.Se todas as
business
es são diretamente afetadas pelasbourgeoisie
suasfatcat_owner
ações, o que você faz após a revolução dos trabalhadores quando expurgafatcat_owner
e tem uma sociedade sem classes?Você tem algumas opções aqui,
RESTRICT
,. Algumas pessoas acreditam que este é o mal menor, mas geralmente estão erradas.Permita que continue. Nesse caso, quando a revolução acontece, o SQL oferece quatro opções,
SET NULL
-- deixe em branco. Quem sabe, talvez o capitalismo seja restaurado, obourgeoisie
surgimento e os oligarcas enchem o papel dofatcat_owners
. Nota importante, a coluna deve serNULLABLE
(nãoNOT NULL
) ou isso nunca pode acontecer.SET DEFAULT
- talvez você tenhaDEFAULT
lidado com isso? ADEFAULT
pode chamar uma função. Talvez seu esquema já esteja pronto para a revolução.CASCADE
- não há controle de danos. Sebourgeoisie
for, o mesmo acontece com obusiness
. Se uma empresa precisa ter umfatcat_pig
, às vezes faz mais sentido perder os dados do que ter uma empresa não em umabusiness
tabela.NO ACTION
- este é essencialmente um método de atrasar a verificação, no MySQL não é diferenteRESTRICT
, mas no PostgreSQL, você seria capaz de fazerNesse sistema, a restrição é validada apenas antes da transação ser confirmada. Isso pode resultar em parar a revolução, mas você pode se recuperar na transação - por algum grau de "recuperação".
fonte
referenced
as tabelas significa tabela pai ereferencing
mesa significa tabela filho?Um simples mnemônico seria
ON DELETE do CASCADE pai [excluindo] aqui
Isso indica quais exclusões (exclusões do pai) são colocadas em cascata, para onde vai a instrução ON DELETE CASCADE (no filho) e o que é excluído (o filho).
fonte
bem, talvez possamos racionalizar a sintaxe. Vamos dar um exemplo de Python:
o que esta linha diz ser on_delete do pai (que é acidentalmente mencionado na declaração), faça a cascata da exclusão no filho. É por isso que a instrução CASCADE é definida no nível filho, marca os filhos que precisam ser excluídos
Por exemplo, se você tivesse outra aula
essa estrutura mostraria claramente quais das crianças precisam ser removidas (Criança) e quais devem permanecer (GrownUpChild), embora órfãs
[Edit: Dado o contexto da discussão, especificamente nos casos de on_delete = models.CASCADE etc,] na verdade, geralmente é um comportamento desejado deixar os filhos de um pai excluído, devido a razões de auditoria e relatório, além de recuperar dados acidentais. exclusões. [é claro que o software em nível corporativo será construído em torno desse comportamento e sinalizará os registros excluídos como excluídos = 1, em vez de excluí-los, e também não os incluirá em nenhuma consulta para o front end, menos alguns relatórios especialmente projetados. Além disso, ele terá a função de remover os registros == 1 excluídos do banco de dados, que geralmente serão executados pelo administrador da interface do usuário, evitando frequentemente qualquer envolvimento por parte do administrador do banco de dados.]
fonte