Pular para o conteúdo principal

Questão de Banco de Dados — Oracle — FGV 2024

Banco de DadosOracle
Código
fg165214
Banca
FGV
Órgão
TJ AP
Ano
2024
Cargo
AJ ( )
João, administrador de banco de dados, deverá projetar um banco de dados Oracle de registro de alunos que contenha várias tabelas para armazenar informações acadêmicas:   \bullet A tabela “Aluno” armazena informações sobre alunos. \bullet A tabela “Notas_Aluno” armazena informações sobre as notas do aluno.   \bullet Ambas as tabelas têm uma coluna chamada “Aluno_ID”.   \bullet A coluna “Aluno_ID” na tabela “Aluno” é uma chave primária.   João deverá criar a chave estrangeira na coluna “aluno_ID” da tabela “Notas_Aluno” para relacionar-se com a coluna “aluno_ID” da tabela “Aluno”. Para isso, João deverá utilizar o seguinte comando:
  1. ACREATE TABLE notas_aluno   (aluno_ID NUMBER(12),    media_notas NUMBER(4,3), CONSTRAINT aluno_ID_fk    REFERENCES aluno(aluno_ID));
  2. BCREATE TABLE notas_aluno   (aluno_ID NUMBER(12),    media_notas NUMBER(4,3), CONSTRAINT FOREIGN KEY     (aluno_ID)REFERENCES aluno (aluno_ID));
  3. CCREATE TABLE notas_aluno (aluno_ID NUMBER(12),    media_notas NUMBER(4,3),  aluno_ID_fk FOREIGN    KEY (aluno_ID)REFERENCES aluno(aluno_ID));
  4. DCREATE TABLE notas_aluno   (aluno_ID NUMBER(12),    media_notas NUMBER(4,3), CONSTRAINT aluno_ID_fk    FOREIGN      KEY      (aluno_ID)     REFERENCES    aluno(aluno_ID));
  5. ECREATE TABLE notas_aluno   (aluno_ID NUMBER(12),    media_notas NUMBER(4,3), CONSTRAINT aluno_ID_fk    REFERENCES     (aluno_ID)      FOREIGN      KEY    aluno(aluno_ID));
Revelar gabarito e comentário

GabaritoD — CREATE TABLE notas_aluno   (aluno_ID NUMBER(12),    media_notas NUMBER(4,3), CONSTRAINT aluno_ID_fk    FOREIGN      KEY      (aluno_ID)     REFERENCES    aluno(aluno_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”.

Chave Estrangeira (FOREIGN KEY) no Oracle

Gabarito: letra D. A sintaxe correta para criar uma chave estrangeira em uma tabela no Oracle é CONSTRAINT nome_da_restricao FOREIGN KEY (coluna) REFERENCES tabela_referenciada (coluna_referenciada). A alternativa D é a única que apresenta exatamente essa estrutura, com a palavra-chave FOREIGN KEY no lugar certo e a referência à tabela aluno e à coluna aluno_ID.

A chave estrangeira (ou foreign key) é o mecanismo do modelo relacional que garante a integridade referencial entre duas tabelas. Ela estabelece que os valores de uma coluna (ou conjunto de colunas) em uma tabela devem corresponder a valores de uma chave primária (ou única) em outra tabela. No caso do enunciado, a tabela Notas_Aluno deve ter uma coluna aluno_ID que só aceite valores que existam na coluna aluno_ID da tabela Aluno (que é a chave primária). Isso impede, por exemplo, que se registre uma nota para um aluno que não existe.

A sintaxe para definir uma chave estrangeira pode aparecer de duas formas principais: inline (dentro da definição da coluna) ou como uma restrição de tabela (constraint). A forma mais comum e recomendada, especialmente quando a chave é composta por mais de uma coluna, é a de restrição de tabela, que é exatamente o que as alternativas tentam reproduzir. A estrutura completa dessa restrição é:

CONSTRAINT nome_da_restricao FOREIGN KEY (coluna_local) REFERENCES tabela_pai (coluna_pai)

Cada parte dessa sintaxe tem um papel específico:

  • CONSTRAINT nome_da_restricao: dá um nome à restrição, o que facilita sua identificação e gerenciamento posterior (por exemplo, para dropá-la ou identificá-la em mensagens de erro).

  • FOREIGN KEY (coluna_local): indica que a coluna (ou colunas) listada na tabela atual será a chave estrangeira.

  • REFERENCES tabela_pai (coluna_pai): aponta para a tabela e a coluna que são referenciadas, ou seja, a chave primária (ou única) da tabela "pai".

A pegadinha desta questão é puramente sintática: a banca embaralha a ordem dos elementos da cláusula CONSTRAINT. O candidato que conhece a sintaxe correta identifica imediatamente que a ordem canônica é CONSTRAINT nome FOREIGN KEY (coluna) REFERENCES tabela (coluna). Qualquer variação dessa ordem (como colocar REFERENCES antes de FOREIGN KEY, ou omitir a palavra FOREIGN KEY, ou colocar o nome da restrição depois de FOREIGN KEY) torna o comando inválido no Oracle.

Vamos analisar cada alternativa em detalhe, verificando a posição exata de cada elemento da sintaxe.

Critério

Alternativa D (correta)

Alternativas A, B, C, E (incorretas)

Ordem dos elementos

CONSTRAINT nome FOREIGN KEY (coluna) REFERENCES tabela (coluna) — sequência canônica

A: omite FOREIGN KEY; B: nome ausente após CONSTRAINT; C: falta CONSTRAINT; E: ordem invertida (REFERENCES antes de FOREIGN KEY)

Palavra-chave CONSTRAINT

Presente, seguida do nome da restrição

A: presente, mas sem FOREIGN KEY; B: usada como nome (inválido); C: ausente; E: presente, mas com ordem errada

Cláusula FOREIGN KEY

Corretamente posicionada após o nome da restrição

A: ausente; B: no lugar do nome; C: sem CONSTRAINT antes; E: após REFERENCES

Cláusula REFERENCES

Aponta para aluno(aluno_ID) no final

A: presente, mas sem coluna local; B: correta, mas nome ausente; C: correta, mas sem CONSTRAINT; E: antes de FOREIGN KEY e com sintaxe quebrada

Validade no Oracle

✅ Comando válido e executável

❌ Todos geram erro de sintaxe

Alternativa A — ❌ Incorreta

Esta alternativa omite a palavra-chave FOREIGN KEY. A cláusula CONSTRAINT aluno_ID_fk REFERENCES aluno(aluno_ID) não é válida, pois o Oracle espera que, após o nome da restrição, venha a expressão FOREIGN KEY (coluna). Sem ela, o comando não sabe qual coluna da tabela notas_aluno será a chave estrangeira. O erro é a ausência do identificador FOREIGN KEY.

Alternativa B — ❌ Incorreta

Aqui, o erro está na posição do nome da restrição. A sintaxe CONSTRAINT FOREIGN KEY (aluno_ID) REFERENCES aluno (aluno_ID) não atribui um nome à restrição; ela tenta usar FOREIGN KEY como se fosse o nome, o que é inválido. A ordem correta exige que o nome venha imediatamente após CONSTRAINT, antes de FOREIGN KEY. O erro é a troca da ordem: o nome da restrição está ausente e FOREIGN KEY está no lugar errado.

Alternativa C — ❌ Incorreta

Nesta alternativa, o nome da restrição aluno_ID_fk aparece solto, sem a palavra CONSTRAINT antes dele. A sintaxe aluno_ID_fk FOREIGN KEY (aluno_ID) REFERENCES aluno(aluno_ID) não é reconhecida pelo Oracle, pois falta a palavra-chave CONSTRAINT que inicia a definição da restrição. O erro é a omissão da palavra CONSTRAINT.

Alternativa D — ✅ Correta ⟵ GABARITO

Esta alternativa apresenta a sintaxe completa e correta: CONSTRAINT aluno_ID_fk FOREIGN KEY (aluno_ID) REFERENCES aluno(aluno_ID). Ela contém todos os elementos na ordem certa: a palavra CONSTRAINT, o nome da restrição (aluno_ID_fk), a expressão FOREIGN KEY com a coluna local (aluno_ID), e a cláusula REFERENCES apontando para a tabela aluno e a coluna aluno_ID. É exatamente o que o Oracle espera para criar uma chave estrangeira como restrição de tabela.

Alternativa E — ❌ Incorreta

Esta alternativa inverte completamente a ordem dos elementos. A sintaxe CONSTRAINT aluno_ID_fk REFERENCES (aluno_ID) FOREIGN KEY aluno(aluno_ID) coloca REFERENCES antes de FOREIGN KEY, e ainda separa a coluna da tabela referenciada de forma incorreta. O Oracle não reconhece essa estrutura. O erro é a inversão total da ordem dos elementos da cláusula.

NÃO CAIA NESSA!

A banca explora a confusão clássica com a ordem dos elementos da cláusula CONSTRAINT. O candidato que decora a sintaxe de forma solta pode se perder entre as alternativas. A ordem canônica é sempre CONSTRAINT nome FOREIGN KEY (coluna) REFERENCES tabela (coluna). Memorize essa sequência como um bloco único: "CONSTRAINT + nome + FOREIGN KEY + (coluna) + REFERENCES + tabela + (coluna)". Com treino, você identifica a correta de imediato, sem precisar analisar cada variação 💪.

Gabarito: letra D

Link permanente: /questoes/fg165214