Alguém pode fornecer uma clara explicação / exemplo do que estas funções fazer, e quando é apropriado usá-los?
Como a chave estrangeira Postgres 'na atualização' e 'on delete' opções funcionam?
Em linha reta do 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)
);
Restringem ou excluir em cascata são as duas opções mais comuns. RESTRINGIR supressão evita de uma linha referenciada. NO ACTION significa que, se ainda existir nenhuma linha de referenciação 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.) CASCADE especifica 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: conjunto padrão NULL e SET. 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,
Análogo ao Eliminar no existe também ON UPDATE, invocado quando um coluna referenciada é alterado (actualizado). As ações possíveis são os mesmos.
edit: Você pode querer ter um olhar para esta questão relacionada: Quando / Por que usar Cascading no SQL Server? . Os conceitos subjacentes à pergunta / respostas são as mesmas.
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 apagar essa é uma informação de outra tabela. Este maneiras que eu preciso fazer apenas 1 apagar e FK que ON apagar 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, ter 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.
Quanto mais freqüentemente coisas "escondidas" 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 cascata DELETE ou UPDATE em 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)













