Pergunta

Alguém pode fornecer uma clara explicação / exemplo do que estas funções fazer, e quando é apropriado usá-los?

Foi útil?

Solução

Straight from Manual ...

Sabemos que as chaves estrangeiras não permitir criação de ordens que não se relacionam com quaisquer produtos. Mas e se um produto é removido após uma ordem é criada que faz referência a ela? SQL permite que você lidar com isso também. Intuitivamente temos algumas opções:

Não permitir a exclusão de um produto referenciado

Excluir o pedido também

Algo mais?

CREATE TABLE order_items (
 product_no integer REFERENCES products ON DELETE RESTRICT,
 order_id integer REFERENCES orders ON DELETE CASCADE,
 quantity integer,
 PRIMARY KEY (product_no, order_id)
);

Restringindo e exclusões em cascata são as duas opções mais comuns. RESTRINGIR impede a eliminação de uma linha referenciada. Nenhum meio de ação que se ainda existem quaisquer linhas que fazem referência quando a restrição for marcada, será gerado um erro; este é o comportamento padrão se você não especificar nada. (A diferença essencial entre estas duas opções é que nenhuma ação permite que a verificação a ser adiada até mais tarde na transação, enquanto RESTRINGIR não.) Especifica cascata que quando uma linha referenciada é excluída, linha (s) fazendo referência a ele deve ser excluído automaticamente também. Há duas outras opções: SET NULL e SET DEFAULT. Estas fazem com que as colunas de referência a ser definido para valores nulos ou valores padrão, respectivamente, quando a linha referenciada é eliminada. Note-se que estes não desculpa de observar quaisquer restrições. Por exemplo, se uma ação especificar SET DEFAULT, mas o valor padrão não satisfizer a chave estrangeira, a operação irá falhar.

De forma análoga ao ON DELETE existe também ON UPDATE que é invocado quando uma coluna referenciada é alterado (atualizado). As ações possíveis são os mesmos.

Editar: Você pode querer ter um olhar para esta questão relacionada: Quando / por que usar Cascading no SQL server? . Os conceitos subjacentes à pergunta / resposta são os mesmos.

Outras dicas

Eu tenho um banco de dados PostgreSQL e eu uso em Apagar quando eu tenho um usuário que eu excluir do banco de dados e eu preciso excluí-lo de informações de outra tabela. Este maneiras que eu preciso fazer apenas 1 exclusão e FK que tem em Excluir irá apagar informações de outra tabela.

Você pode fazer o mesmo com ON Update. Se você atualizar a tabela eo campo tem uma FK com On Update, se for feita uma alteração no FK você será notado na mesa de FK.

O que Daok diz é verdade ... ele pode ser bastante conveniente. Por outro lado, tendo as coisas acontecem automagicamente no banco de dados pode ser um problema real, especialmente quando se trata de eliminar dados. É possível que no futuro alguém vai contar com o fato de que FKs geralmente evitar a exclusão dos pais quando há crianças e não percebem que o uso do ON DELETE Cascade não só não impede exclusão, faz enormes quantidades de dados em dezenas de outras tabelas ir embora, graças a uma cachoeira de exclusões em cascata.

@ comentário de Arthur.

As coisas com mais freqüência "escondido" acontecerá no banco de dados a menos provável se torna que ninguém nunca vai ter um bom controle sobre o que está acontecendo. Triggers (e este é essencialmente um gatilho) pode causar a minha ação simples de remover uma linha, ter enormes repercussões em toda a minha base de dados. Eu emitir uma instrução DELETE e 17 mesas são afetados com cascatas de gatilhos e restrições e nada disso é imediatamente aparente ao emissor do comando. OTOH, Se eu colocar a exclusão do pai e todos os seus filhos em um procedimento, então é muito fácil e claro para qualquer um ver exatamente o que vai acontecer quando eu emitir o comando.

Ela não tem absolutamente nada a ver com o quão bem eu projetar um banco de dados. Tem tudo a ver com as questões operacionais introduzidas pela gatilhos.

Em vez de escrever o método para fazer todo o trabalho, da atualização de exclusão ou cascata cascata, você pode simplesmente escrever uma mensagem de aviso em seu lugar. Muito mais fácil do que reinventar a roda, e deixa claro para o cliente (e novos desenvolvedores pegar o código)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top