2.18. Restrições de Integridade
Durante a criação das tabelas estudante, disciplina, professor e estudante_diciplina, especificamos uma série de restrições sobre os valores a serem incluídos ou alterados nessas tabelas. Nesta seção vamos discutir em detalhes essas restrições.
2.18.1. Restrições de Valor nas Colunas
A tabela estudante teve a coluna genero definida com uma restrição que avalia se o caractere usado esteja restrito aos valores M ou F. Vamos tentar inserir um valor nessa tabela com um valor de gênero fora desse conjunto de valores para compreender o que o SGBD fará:
INSERT INTO estudante (nome, data_nascimento, genero, data_matricula)
VALUES ('Zuleica', '1986-06-30', 'O', '2019-01-01');
Resultado:
ERROR: new row for relation "estudante" violates check constraint "estudante_genero_check"
DETAIL: Failing row contains (38, Zuleica, 1986-06-30, O, 2019-01-01).
Repare na mensagem acima que o SGBD fez a verificação do valor fornecido na coluna genero.
De maneira similar, se tentarmos alterar o valor do número de créditos das linhas da tabela disciplina para um valor fora do interval [1, 6], seremos alertados pelo SGBD da impossibilidade:
UPDATE disciplina SET creditos = 8;
Resultado:
ERROR: new row for relation "disciplina" violates check constraint "disciplina_creditos_check"
DETAIL: Failing row contains (1, Matemática, 8, 1).
Repare na mensagem acima que a tentativa de alterar a primeira linha causou um erro por violar a restrição imposta na coluna creditos da tabela disciplina.
2.18.2. Restrições de Chave Estrangeira
A tabela disciplina possui uma chave estrangeira, a coluna professor_codigo, que referencia a coluna codigo da tabela professor.
O professor Romildo, que possui codigo 1, leciona as disciplinas Matemática e Fisica. Vamos tentar remover a linha deste professor da tabela professor:
DELETE FROM professor WHERE codigo = 1;
O SGBD irá retornar um erro com a seguinte mensagem:
ERROR: update or delete on table "professor" violates foreign key constraint "disciplina_professor_codigo_fkey" on table "disciplina"
DETAIL: Key (codigo)=(1) is still referenced from table "disciplina".
Isto indica que existem linhas na tabela disciplina que referenciam a linha do professor Romildo na tabela professor. A condição da chave estrangeira ON DELETE NO ACTION foi responsável por este controle.
Agora, vamos alterar o código do professor Romildo, isto é, o valor da sua chave primária, para o próximo valor da sequencia mantida para essa coluna:
UPDATE professor SET codigo = DEFAULT WHERE codigo = 1;
Resultado:
UPDATE 1
Agora, localize as linhas da tabela disciplina associadas a este professor:
SELECT d.*
FROM professor AS p,
disciplina AS d
WHERE p.codigo = d.professor_codigo
AND p.nome = 'Romildo';
Resultado:
codigo | titulo | creditos | professor_codigo
--------+------------+----------+------------------
1 | Matemática | 4 | 7
2 | Fisica | 4 | 7
(2 rows)
Repare que a atualização do código do professor propagou o seu novo valor de chave (7) para as linhas da tabela disciplina. Isso foi possível pela restrição de chave estrangeira ter especificado esse comportamento através da condição ON UPDATE CASCADE.