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.
A1 – 1 – 2
B2 – NULL – 4
C1 – NULL – 4
D2 – 1 – 2
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.
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).