Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2023

Banco de DadosConsultas e Comandos em SQL
Código
qa537507
Banca
FUNDATEC
Órgão
BRDE
Ano
2023
Cargo
Ana Sist ( )

Considere as tabelas ESPECIALIDADES e MEDICOS abaixo, bem como a sequência de criação de instâncias (padrão SQL99 ou superior).

 

create table ESPECIALIDADES

(code int not null primary key,

nomee varchar(50) not null);

create table MEDICOS

(codm int not null primary key,

nomem varchar(50) not null,

code int,

formacao varchar(100) not null,

foreign key(code) references ESPECIALIDADES (code)

on delete set null);

 

insert into ESPECIALIDADES values (1,'cardiologia');

insert into ESPECIALIDADES values (2,'oftalmologia');

insert into ESPECIALIDADES values (3,'pediatria');

insert into MEDICOS values (1, 'joao', 1, 'ufrgs');

insert into MEDICOS values (2, 'maria', 1, 'pucrs');

insert into MEDICOS values (3, 'pedro', 2, 'ufsm');

 

Considere a sequência de comandos SQL abaixo, em que cada comando deve ser considerado uma transação separada:

 

I. delete from ESPECIALIDADES where nomee = 'pediatria';

 

II. update ESPECIALIDADES set code = 4 where nomee = 'oftalmologia';

 

III. delete from ESPECIALIDADES where nomee = 'cardiologia';

 

Após a execução das transações I, II e III, é possível afirmar que:

  • A tabela ESPECIALIDADES tem                tupla(s);
  • Na tabela MEDICOS, no registro em que MEDICOS.codm = 1, o valor do atributo MEDICOS.code é               ;
  • Na tabela MEDICOS, no registro em que MEDICOS.codm = 3, o valor do atributo MEDICOS.code é               .
 

Assinale a alternativa que preenche, correta e respectivamente, as lacunas do trecho acima.

  1. A1 – 1 – 2
  2. B2 – NULL – 4
  3. C1 – NULL – 4
  4. D2 – 1 – 2
  5. E1 – NULL – 2
Revelar gabarito e comentário

GabaritoE — 1 – NULL – 2

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: Ações ON DELETE e o Comportamento das Transações SQL

Gabarito: letra E. Após executar as três transações, a tabela ESPECIALIDADES fica com 1 tupla (apenas 'oftalmologia', com code = 4), o médico de codm = 1 fica com NULL em MEDICOS.code (porque a especialidade 'cardiologia' foi apagada e a FK tem ON DELETE SET NULL), e o médico de codm = 3 fica com 2 em MEDICOS.code (sua especialidade 'oftalmologia' foi atualizada para code = 4, mas o valor na tabela MEDICOS permanece 2, pois o UPDATE não propaga para a FK). A chave para resolver é entender que ON DELETE SET NULL só age no DELETE, e que o UPDATE na tabela pai não altera automaticamente os valores da chave estrangeira na tabela filha.

Vamos por partes. O comando CREATE TABLE MEDICOS define uma chave estrangeira (foreign key) na coluna code, que referencia a coluna code da tabela ESPECIALIDADES. A cláusula ON DELETE SET NULL especifica o que acontece com os registros filhos quando um registro pai é excluído: o valor da coluna da chave estrangeira nos filhos é definido como NULL. Isso é uma das ações de integridade referencial previstas no padrão SQL — outras são ON DELETE CASCADE (apaga os filhos junto), ON DELETE RESTRICT/NO ACTION (bloqueia a exclusão) e ON DELETE SET DEFAULT (define um valor padrão).

Agora, o ponto crucial que a banca explora: essa ação só se aplica ao comando DELETE. Quando você executa um UPDATE na tabela pai (como na transação II), alterando o valor da chave primária, a chave estrangeira na tabela filha não é atualizada automaticamente — a menos que você tenha definido ON UPDATE CASCADE (o que não foi feito aqui). No padrão SQL, se você tentar atualizar uma chave primária que é referenciada por uma chave estrangeira sem ON UPDATE CASCADE, o banco normalmente bloqueia a operação (comportamento padrão NO ACTION). Mas a questão pede para considerar que a transação II é executada com sucesso — e, mesmo que fosse permitida, o valor em MEDICOS.code não mudaria para os registros existentes, pois não há propagação.

Vamos simular cada transação:

Estado inicial:

  • ESPECIALIDADES: (1, 'cardiologia'), (2, 'oftalmologia'), (3, 'pediatria')

  • MEDICOS: (1, 'joao', 1), (2, 'maria', 1), (3, 'pedro', 2)

Transação I: DELETE FROM ESPECIALIDADES WHERE nomee = 'pediatria';

  • Remove a tupla (3, 'pediatria'). Nenhum médico referencia code = 3, então nada acontece em MEDICOS.

  • ESPECIALIDADES agora tem 2 tuplas: (1, 'cardiologia'), (2, 'oftalmologia').

Transação II: UPDATE ESPECIALIDADES SET code = 4 WHERE nomee = 'oftalmologia';

  • Altera a tupla (2, 'oftalmologia') para (4, 'oftalmologia').

  • Atenção: o médico de codm = 3 tem MEDICOS.code = 2, que referenciava a especialidade 'oftalmologia'. Como não há ON UPDATE CASCADE, o valor em MEDICOS.code permanece 2 — e, na prática, ficaria órfão (apontando para um code que não existe mais), a menos que o banco bloqueie a operação. A questão considera que a operação é executada, então o valor continua 2.

  • ESPECIALIDADES agora tem 2 tuplas: (1, 'cardiologia'), (4, 'oftalmologia').

Transação III: DELETE FROM ESPECIALIDADES WHERE nomee = 'cardiologia';

  • Remove a tupla (1, 'cardiologia').

  • Como a FK tem ON DELETE SET NULL, os médicos que referenciavam code = 1 (joao, codm = 1, e maria, codm = 2) têm MEDICOS.code definido como NULL.

  • ESPECIALIDADES agora tem 1 tupla: (4, 'oftalmologia').

Resultado final:

  • ESPECIALIDADES: 1 tupla.

  • MEDICOS.codm = 1 → MEDICOS.code = NULL.

  • MEDICOS.codm = 3 → MEDICOS.code = 2 (não foi afetado pelo DELETE da cardiologia, e o UPDATE não propagou).

Portanto, a sequência correta é 1 – NULL – 2, que corresponde à letra E.

NÃO CAIA NESSA!

A banca tenta fazer você acreditar que o UPDATE na tabela pai também propaga para a tabela filha, como se houvesse ON UPDATE CASCADE. Mas a cláusula definida é apenas ON DELETE SET NULL — ela só age no DELETE. Além disso, muitos candidatos confundem o efeito do UPDATE: mesmo que o code da especialidade mude de 2 para 4, o valor em MEDICOS.code do médico 3 continua 2, pois não há atualização em cascata. Fique atento: ON DELETE e ON UPDATE são ações independentes.

Alternativa A — ❌ Incorreta

Afirma que MEDICOS.codm = 1 fica com code = 1. Isso ignora o efeito do ON DELETE SET NULL na transação III: ao apagar a especialidade 'cardiologia' (code = 1), os médicos que a referenciam têm o valor da FK anulado. O correto é NULL.

Alternativa B — ❌ Incorreta

Afirma que ESPECIALIDADES fica com 2 tuplas. Após a transação I (delete de 'pediatria') e a transação III (delete de 'cardiologia'), restam apenas 'oftalmologia' — ou seja, 1 tupla. O valor 2 corresponderia ao estado após a transação II, mas a transação III remove outra tupla.

Alternativa C — ❌ Incorreta

Afirma que MEDICOS.codm = 3 fica com code = 4. Isso seria verdade se houvesse ON UPDATE CASCADE, mas a FK só tem ON DELETE SET NULL. O UPDATE na tabela pai não altera o valor na tabela filha; portanto, o code do médico 3 permanece 2.

Alternativa D — ❌ Incorreta

Afirma que ESPECIALIDADES fica com 2 tuplas e que MEDICOS.codm = 1 fica com code = 1. Ambos os erros: a contagem final é 1 tupla (após os dois DELETEs), e o code do médico 1 é NULL (pelo ON DELETE SET NULL).

Alternativa E — ✅ Correta ⟵ GABARITO

Reflete exatamente o estado final: ESPECIALIDADES com 1 tupla (a 'oftalmologia' com code = 4), MEDICOS.codm = 1 com code = NULL (após o DELETE da cardiologia com ON DELETE SET NULL), e MEDICOS.codm = 3 com code = 2 (o UPDATE não propaga para a FK).

Gabarito: letra E

Link permanente: /questoes/qa537507