Pular para o conteúdo principal

Questão de Banco de Dados — SQL — Quadrix 2024

Banco de DadosSQL
Código
qg349456
Banca
Quadrix
Órgão
CREFITO - 18ª Região (AC e RO)
Ano
2024
Nível
Superior
Cargo
Analista de Tecnologia da Informação
Suponha‑se um banco de dados para uma clínica de fisioterapia com as seguintes tabelas: Paciente; Tratamento; e Fisioterapeuta. Cada tratamento é realizado por um fisioterapeuta e é registrado na tabela Tratamento com referência ao paciente e ao fisioterapeuta. Com base nessas informações, assinale a alternativa que apresenta o(s) código(s) SQL que garante(m) que cada tratamento registrado tenha um paciente e um fisioterapeuta válidos, assegurando a integridade referencial.
  1. AALTER TABLE TratamentoADD CONSTRAINT fk_paciente FOREIGN KEY (paciente_id)REFERENCES Paciente(id);
  2. BALTER TABLE TratamentoADD CONSTRAINT fk_fisioterapeuta FOREIGN KEY (fisioterapeuta_id)REFERENCES Fisioterapeuta(id);
  3. CALTER TABLE TratamentoADD CONSTRAINT check_paciente_id CHECK (paciente_id > 0);
  4. DALTER TABLE TratamentoADD CONSTRAINT unique_tratamento UNIQUE (tratamento_id);
  5. EALTER TABLE TratamentoADD CONSTRAINT fk_paciente FOREIGN KEY (paciente_id)REFERENCES Paciente(id);ALTER TABLE TratamentoADD CONSTRAINT fk_fisioterapeuta FOREIGN KEY (fisioterapeuta_id)REFERENCES Fisioterapeuta(id);
Revelar gabarito e comentário

GabaritoE — ALTER TABLE Tratamento ADD CONSTRAINT fk_paciente FOREIGN KEY (paciente_id) REFERENCES Paciente(id); ALTER TABLE Tratamento ADD CONSTRAINT fk_fisioterapeuta FOREIGN KEY (fisioterapeuta_id) REFERENCES Fisioterapeuta(id);

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 em SQL: FOREIGN KEY

Gabarito: letra E. Para garantir que cada tratamento registrado tenha um paciente e um fisioterapeuta válidos, é necessário criar duas restrições de chave estrangeira (FOREIGN KEY) na tabela Tratamento, uma referenciando a tabela Paciente e outra referenciando a tabela Fisioterapeuta — exatamente o que a alternativa E faz. As demais alternativas são insuficientes ou incorretas porque criam apenas uma das chaves estrangeiras, ou usam restrições que não asseguram a integridade referencial (CHECK e UNIQUE).

A integridade referencial é um dos pilares do modelo relacional. Ela garante que um valor de chave estrangeira em uma tabela (a tabela filha) sempre corresponda a um valor de chave primária existente na tabela referenciada (a tabela pai). No caso da clínica de fisioterapia, a tabela Tratamento possui duas colunas que são chaves estrangeiras: paciente_id, que referencia a chave primária da tabela Paciente, e fisioterapeuta_id, que referencia a chave primária da tabela Fisioterapeuta. Sem essas restrições, seria possível inserir um tratamento com um paciente_id que não existe na tabela Paciente, ou com um fisioterapeuta_id que não existe na tabela Fisioterapeuta, corrompendo a consistência do banco de dados.

A sintaxe para adicionar uma chave estrangeira a uma tabela existente é feita com o comando ALTER TABLE, seguido da cláusula ADD CONSTRAINT, que dá um nome à restrição, e da cláusula FOREIGN KEY, que especifica a coluna da tabela filha, e da cláusula REFERENCES, que especifica a tabela pai e a coluna referenciada. No exemplo do contexto, vemos a criação de chaves estrangeiras tanto na definição da tabela quanto em uma cláusula ALTER:

Conteúdo de apoio (SQL):

ALTER TABLE nome_da_tabela
ADD CONSTRAINT nome_da_restricao FOREIGN KEY(coluna1, coluna2)
REFERENCES tabela_referenciada (chave1, chave2);

A pegadinha desta questão está em exigir que ambas as chaves estrangeiras sejam criadas. A alternativa A cria apenas a referência ao paciente, e a alternativa B apenas a referência ao fisioterapeuta. Nenhuma delas, isoladamente, garante a integridade referencial completa da tabela Tratamento. A alternativa E é a única que combina as duas restrições, assegurando que todo tratamento tenha um paciente e um fisioterapeuta válidos.

As restrições CHECK e UNIQUE não têm relação com integridade referencial. A restrição CHECK valida se os valores de uma coluna atendem a uma condição específica (por exemplo, paciente_id > 0), mas não verifica se o valor existe em outra tabela. A restrição UNIQUE garante que os valores de uma coluna sejam únicos, mas não estabelece vínculo com outra tabela. Portanto, as alternativas C e D são incorretas para o propósito da questão.

Guarde a distinção central: integridade referencial é garantida exclusivamente por FOREIGN KEY. É esse critério que separa a alternativa correta das demais.

Critério

A (só FK Paciente)

B (só FK Fisioterapeuta)

C (CHECK paciente_id > 0)

D (UNIQUE tratamento_id)

E (FK Paciente + FK Fisioterapeuta)

Garante paciente válido?

✅ Sim

❌ Não

❌ Não (só valida número positivo)

❌ Não

✅ Sim

Garante fisioterapeuta válido?

❌ Não

✅ Sim

❌ Não

❌ Não

✅ Sim

Usa FOREIGN KEY (integridade referencial)?

✅ Sim

✅ Sim

❌ Não

❌ Não

✅ Sim

Cobre as duas referências obrigatórias?

❌ Incompleta

❌ Incompleta

❌ Não se aplica

❌ Não se aplica

✅ Completa

Resultado

❌ Incorreta

❌ Incorreta

❌ Incorreta

❌ Incorreta

Gabarito

Alternativa A — ❌ Incorreta

Cria apenas a chave estrangeira para a tabela Paciente. Isso garante que o paciente_id seja válido, mas não faz nada em relação ao fisioterapeuta_id. Um tratamento poderia ser inserido com um fisioterapeuta inexistente, violando a integridade referencial. A alternativa é incompleta — falta a segunda restrição.

Alternativa B — ❌ Incorreta

Cria apenas a chave estrangeira para a tabela Fisioterapeuta. O raciocínio é simétrico ao da alternativa A: garante a validade do fisioterapeuta_id, mas não do paciente_id. A alternativa é incompleta — falta a primeira restrição.

Alternativa C — ❌ Incorreta

Usa uma restrição CHECK para garantir que paciente_id > 0. Essa restrição apenas valida que o valor seja um número positivo, mas não verifica se o paciente existe na tabela Paciente. É possível inserir um tratamento com paciente_id = 999 (positivo), mesmo que não exista nenhum paciente com esse código. A restrição CHECK não estabelece vínculo entre tabelas e, portanto, não assegura a integridade referencial.

Alternativa D — ❌ Incorreta

Usa uma restrição UNIQUE na coluna tratamento_id. Essa restrição garante que os valores de tratamento_id sejam únicos, o que é uma propriedade de chave primária, mas não tem nenhuma relação com as tabelas Paciente ou Fisioterapeuta. Não impede que um tratamento seja registrado com um paciente ou fisioterapeuta inexistente.

Alternativa E — ✅ Correta ⟵ GABARITO

Cria as duas chaves estrangeiras necessárias: uma referenciando a tabela Paciente e outra referenciando a tabela Fisioterapeuta. Com essas duas restrições, o banco de dados rejeita qualquer inserção ou atualização em Tratamento que use um paciente_id ou fisioterapeuta_id que não exista nas tabelas referenciadas. É a única alternativa que garante a integridade referencial completa da tabela Tratamento.

NÃO CAIA NESSA!

Em questões de SQL sobre integridade referencial, identifique todas as colunas da tabela filha que são chaves estrangeiras. Cada uma delas exige uma restrição FOREIGN KEY própria. Se a questão pedir que "cada tratamento tenha um paciente e um fisioterapeuta válidos", são duas restrições — uma para cada coluna. Alternativas que criam apenas uma são armadilhas clássicas de incompletude.

Gabarito: letra E

Link permanente: /questoes/qg349456