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
.