3.3. Chaves estrangeiras #

Reveja as tabelas clima e cidades no Capítulo 2. Considere o seguinte problema: desejamos ter certeza de que não serão inseridas linhas na tabela clima sem que haja uma entrada correspondente na tabela cidades. Isso é 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. Essa abordagem possui vários problemas, sendo muito inconveniente, por isso o PostgreSQL pode fazer isso para você.

A nova declaração das tabelas ficaria assim:

CREATE TABLE cidades (
    nome         varchar(80) PRIMARY KEY,
    localizacao  point
);

CREATE TABLE clima (
    cidade       varchar(80) REFERENCES cidades(nome),
    temp_min     int,
    temp_max     int,
    prcp         real,
    data         date
);

Agora vamos tentar inserir um registro inválido:

INSERT INTO clima (data, cidade, temp_min, temp_max)
    VALUES ('2022-06-29', 'Rio de Janeiro - RJ', 17, 29);
ERRO:  inserção ou atualização em tabela "clima" viola restrição de chave estrangeira "clima_cidade_fkey"
DETALHE:  Chave (cidade)=(Rio de Janeiro - RJ) não está presente na tabela "cidades".

O comportamento das chaves estrangeiras pode receber ajuste fino na aplicação. Não iremos além desse exemplo simples nesse tutorial, mas consulte o Capítulo 5 para obter informações adicionais. 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.