2.10. Seguindo as dependências

Ao criar uma estrutura de banco de dados complexa, envolvendo muitas tabelas com restrições de chave estrangeira, visões, gatilhos, funções, etc. cria-se, implicitamente, uma rede de dependências entre os objetos. Por exemplo, uma tabela com uma restrição de chave estrangeira depende da tabela referenciada.

Para garantir a integridade de toda a estrutura do banco de dados, o PostgreSQL não permite a exclusão de um objeto havendo outros objetos dependentes dele. Por exemplo, tentar remover a tabela produtos conforme declarada na Seção 2.4.5, onde a tabela pedidos depende dela, produz uma mensagem de erro como mostrada abaixo:

DROP TABLE produtos;
NOTICE:  constraint $1 on table pedidos depends on table produtos
ERROR:  Cannot drop table produtos because other objects depend on it
        Use DROP ... CASCADE to drop the dependent objects too

A mensagem de erro mostra uma dica útil: Se não tem importância a exclusão de todos os objetos dependentes, então pode ser executado

DROP TABLE produtos CASCADE;

e todos os objetos dependentes serão removidos. Neste caso, não será removida a tabela pedidos, será removida apenas a restrição de chave estrangeira (caso se deseje saber o que DROP ... CASCADE fará, deve ser executado o comando DROP sem o CASCADE, e lida a mensagem NOTICE).

Todos os comandos de exclusão do PostgreSQL suportam a especificação de CASCADE. Obviamente, a natureza das dependências possíveis varia conforme o tipo do objeto. Pode ser escrito RESTRICT em vez de CASCADE para obter o comportamento padrão de impedir a exclusão do objeto quando existem objetos dependentes.

Nota: No padrão SQL a especificação de RESTRICT ou CASCADE é obrigatória. Nenhum banco de dados implementa deste modo, mas fazer RESTRICT ou CASCADE o comportamento padrão varia entre os sistemas.

Nota: As dependências de chave estrangeira e as dependências de coluna serial das versões do PostgreSQL anteriores a 7.3, não são mantidas ou criadas durante o processo de atualização de versão. Todos os outros tipos de dependência são criados de forma apropriada durante a atualização de versão.