Reveja as tabelas clima
e cidades
no
Capítulo 2
. Considere o seguinte problema: Desejamos ter certeza que não serão inseridas linhas na tabela clima
sem que haja um registro correspondente na tabela cidades
. Isto é chamado de manter a integridade referencial dos dados. Em sistemas de banco de dados muito simples poderia ser implementado (caso fosse) olhando primeiro a tabela cidades
para verificar se existe a linha correspondente e, depois, inserir ou rejeitar a nova linha de clima
. Esta abordagem possui vários problemas, e é muito inconveniente, por isso o PostgreSQL pode realizar esta operação por você.
A nova declaração das tabelas ficaria assim:
CREATE TABLE cidades ( cidade varchar(80) primary key, localizacao point ); CREATE TABLE clima ( cidade varchar(80) references cidades(cidade), temp_min int, temp_max int, prcp real, data date );
Agora, ao se tentar inserir uma linha inválida:
INSERT INTO clima VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28');
ERROR: insert or update on table "clima" violates foreign key constraint "$1" DETAIL: Key (cidade)=(Berkeley) is not present in table "cidades". -- Tradução da mensagem ERRO: inserção ou atualização na tabela "clima" viola a restrição de chave estrangeira "$1" DETALHE: Chave (cidade)=(Berkeley) não está presente na tabela "cidades"
O comportamento das chaves estrangeiras pode receber ajuste fino na aplicação. Não iremos além deste exemplo simples neste tutorial, mas consulte o Capítulo 5 para obter mais informações. Com certeza o uso correto de chaves estrangeiras melhora a qualidade das aplicações de banco de dados, portanto incentivamos muito que se aprenda a usá-las.