Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas e Comandos em SQL
Código
fg165221
Banca
FGV
Órgão
TJ AP
Ano
2024
Cargo
AJ ( )
Considere um esquema relacional criado com o seguinte script SQL.
create table E1( a int not null primary key, b int not null)
create table E2( c int not null, d int not null foreign key references E1(a))
Para evitar a introdução de erros de integridade na tabela E2 decorrentes da remoção de registros da tabela E1, a cláusula complementar na definição da chave estrangeira seria:
Ano action;
Bon delete cascade;
Con delete raiserror;
Don delete restrict;
Eset null.
Revelar gabarito e comentário▾
GabaritoB — on delete cascade;
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Integridade Referencial e Ações de Exclusão em Chaves Estrangeiras
Gabarito: letra B. Para evitar erros de integridade na tabela E2 quando um registro de E1 é removido, a cláusula complementar correta é ON DELETE CASCADE, que propaga a exclusão para os registros filhos. Essa é uma das ações de integridade referencial definidas no padrão SQL, que determinam o comportamento do banco quando a chave primária referenciada é alterada ou excluída.
A integridade referencial é um dos pilares do modelo relacional. Ela garante que um valor de chave estrangeira em uma tabela filha (E2) sempre corresponda a um valor de chave primária existente na tabela pai (E1). Sem essa garantia, o banco de dados pode conter registros "órfãos", que apontam para dados que não existem mais, comprometendo a consistência das informações.
Quando definimos uma chave estrangeira, podemos especificar o que deve acontecer com os registros filhos quando o registro pai é alvo de uma operação de exclusão (ON DELETE) ou de atualização (ON UPDATE). As opções padrão do SQL são:
CASCADE: a operação é propagada. Se um registro pai é excluído, todos os registros filhos que o referenciam também são excluídos automaticamente. Se um valor de chave é atualizado, os valores correspondentes nas tabelas filhas também são atualizados.
SET NULL: quando o registro pai é excluído ou atualizado, o valor da chave estrangeira nos registros filhos é definido como NULL. Essa opção exige que a coluna da chave estrangeira não tenha a restrição NOT NULL.
SET DEFAULT: similar ao SET NULL, mas define o valor da chave estrangeira para um valor padrão pré-definido.
RESTRICT: impede a operação no registro pai se existirem registros filhos que o referenciam. A exclusão ou atualização é bloqueada e um erro é gerado.
NO ACTION: muito similar ao RESTRICT. A operação no registro pai é verificada e, se houver dependências, é rejeitada. A diferença sutil entre eles está no momento da verificação (imediatamente ou ao final da transação), mas na prática, para a maioria dos SGBDs, o efeito é o mesmo: a operação é bloqueada.
No enunciado, a tabela E2 possui uma chave estrangeira que referencia a chave primária da tabela E1. O objetivo é "evitar a introdução de erros de integridade na tabela E2 decorrentes da remoção de registros da tabela E1". Isso significa que, ao excluir um registro de E1, não podemos deixar registros em E2 apontando para um valor que não existe mais. A solução que garante a integridade de forma automática é o ON DELETE CASCADE, que remove também os registros dependentes em E2.
Vamos analisar cada alternativa:
Ação de Integridade
Comportamento na Remoção do Pai (E1)
Efeito em E2
Atende ao Enunciado?
NO ACTION (A)
Bloqueia a exclusão se houver filhos
Nenhum registro é alterado; erro é gerado
❌ Não (impede a remoção)
ON DELETE CASCADE (B)
Exclui o pai e propaga a exclusão
Registros filhos são excluídos automaticamente
✅ Sim (remove sem órfãos)
ON DELETE RAISERROR (C)
Cláusula inválida no padrão SQL
Não se aplica
❌ Não (sintaxe inexistente)
ON DELETE RESTRICT (D)
Bloqueia a exclusão se houver filhos
Nenhum registro é alterado; erro é gerado
❌ Não (impede a remoção)
SET NULL (E)
Exclui o pai e define FK como NULL
Exigiria coluna d anulável, mas ela é NOT NULL
❌ Não (violaria a restrição)
Alternativa A — ❌ Incorreta
NO ACTION é uma ação válida, mas não atende ao objetivo do enunciado. Ela impede a exclusão do registro em E1 se houver registros dependentes em E2, gerando um erro. Isso evita a violação de integridade, mas não permite a remoção do registro pai, o que não é o que se busca quando se quer "evitar erros decorrentes da remoção" — a intenção é permitir a remoção de forma segura, não bloqueá-la.
Alternativa B — ✅ Correta ⟵ GABARITO
ON DELETE CASCADE é a cláusula que, ao excluir um registro da tabela E1 (pai), exclui automaticamente todos os registros da tabela E2 (filha) que referenciam aquele registro. Isso garante que não haja registros órfãos em E2, mantendo a integridade referencial sem gerar erros. É a solução clássica para o problema descrito.
Alternativa C — ❌ Incorreta
ON DELETE RAISERROR não é uma cláusula válida do padrão SQL para chaves estrangeiras. RAISERROR é um comando usado em linguagens de programação como T-SQL (SQL Server) para gerar mensagens de erro, mas não é uma ação de integridade referencial.
Alternativa D — ❌ Incorreta
ON DELETE RESTRICT impede a exclusão do registro em E1 se houver registros dependentes em E2. Assim como NO ACTION, ela bloqueia a operação, o que não é o objetivo do enunciado, que busca uma forma de permitir a remoção sem violar a integridade.
Alternativa E — ❌ Incorreta
SET NULL é uma ação válida, mas não é a mais adequada para este caso. Ela definiria o valor da chave estrangeira em E2 como NULL quando o registro em E1 fosse excluído. Porém, a coluna d em E2 é definida como NOT NULL no script, o que tornaria essa operação inválida e geraria um erro. Além disso, mesmo que a coluna permitisse NULL, a ação CASCADE é a que melhor expressa a intenção de remover os dados dependentes.
NÃO CAIA NESSA!
A banca explora a confusão entre as ações que bloqueiam a operação (RESTRICT e NO ACTION) e as que propagam a operação (CASCADE e SET NULL). O enunciado pede para "evitar erros decorrentes da remoção", o que pode levar o candidato a pensar em bloquear a remoção. No entanto, a intenção é permitir a remoção de forma segura, propagando a exclusão para os registros filhos. Além disso, a alternativa SET NULL é uma armadilha, pois parece razoável, mas falha porque a coluna d é NOT NULL.