Como a chave estrangeira Postgres 'na atualização' e 'on delete' opções funcionam?

votos
20

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

Publicado 22/10/2008 em 15:07
fonte usuário
Em outras línguas...                            


4 respostas

votos
24

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.

Respondeu 22/10/2008 em 15:11
fonte usuário

votos
0

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.

Respondeu 22/10/2008 em 15:15
fonte usuário

votos
0

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.

Respondeu 22/10/2008 em 15:48
fonte usuário

votos
0

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)

Respondeu 08/07/2010 em 10:27
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more