Questão de Banco de Dados — PostgreSQL — CESPE / CEBRASPE 2025
- Código
- ce417316
- Banca
- CESPE / CEBRASPE
- Órgão
- STM
- Ano
- 2025
- Cargo
- AJ ( )
- CCerto
- EErrado
GabaritoE — Errado
Gabarito: Errado. O comando SELECT * FROM veiculo; não retornará apenas a linha da bicicleta: no PostgreSQL, uma consulta a uma tabela-pai inclui, por padrão, as linhas das tabelas-filhas que herdam dela. Como carro herda de veiculo, o resultado trará também os dois carros inseridos, totalizando três linhas. Essa é a regra da herança de tabelas no PostgreSQL, que difere do comportamento de outros SGBDs.
A herança de tabelas é um recurso do modelo objeto-relacional do PostgreSQL que permite que uma tabela (filha) herde as colunas de outra (pai). Quando você cria uma tabela com INHERITS, a tabela filha passa a ter todas as colunas da tabela pai, além das suas próprias colunas. No exemplo, carro herda id e nome de veiculo e adiciona a coluna placa. Os dados inseridos na tabela filha são armazenados nela, mas são visíveis em consultas à tabela pai, a menos que se use a cláusula ONLY.
O comportamento padrão do SELECT em uma tabela que possui descendentes é incluir as linhas de todas as tabelas que herdam dela. Isso é uma característica documentada do PostgreSQL: "Consultas em tabelas pai incluem registros das tabelas filhas". Para consultar apenas a tabela pai, é necessário usar SELECT * FROM ONLY veiculo;. Essa é a pegadinha central da questão: o candidato que conhece o comportamento de outros bancos (onde herança não existe ou não funciona assim) tende a marcar como certo, mas no PostgreSQL o resultado inclui as linhas das filhas.
Vamos verificar o que acontece passo a passo:
CREATE TABLE veiculo (id SERIAL PRIMARY KEY, nome VARCHAR(50) NOT NULL); – cria a tabela pai com as colunas id e nome.
CREATE TABLE carro (placa VARCHAR(7) UNIQUE NOT NULL) INHERITS (veiculo); – cria a tabela filha carro, que herda id e nome e adiciona placa.
INSERT INTO veiculo (nome) VALUES ('Bicicleta'); – insere uma linha na tabela pai.
INSERT INTO carro (nome, placa) VALUES ('Tesla Model Y', 'Y1357'), ('BMW X6','W6789'); – insere duas linhas na tabela filha.
SELECT * FROM veiculo; – como veiculo tem uma tabela filha, a consulta retorna as linhas de veiculo e de carro.
O resultado real seria:
id | nome |
|---|---|
1 | Bicicleta |
2 | Tesla Model Y |
3 | BMW X6 |
Note que os id dos carros são gerados pela sequência compartilhada (SERIAL), então os valores continuam a sequência após o 1.
A alternativa apresentada no enunciado mostra apenas a linha da bicicleta, o que está incorreto. Portanto, o item é Errado.
A banca explora a diferença entre o comportamento do PostgreSQL e o de outros SGBDs. Em bancos como MySQL ou SQL Server, não existe herança de tabelas, então uma consulta à tabela pai retornaria apenas os dados dela. No PostgreSQL, a herança faz com que a consulta inclua as linhas das filhas. O candidato que não conhece esse recurso específico tende a marcar como certo, mas a resposta correta é Errado.
Para consultar apenas a tabela pai, use SELECT * FROM ONLY veiculo;. Essa é uma dica prática para provas e para o dia a dia. Lembre-se: no PostgreSQL, SELECT em tabela com herança inclui as filhas; ONLY restringe à tabela especificada.
Gabarito: Errado
Link permanente: /questoes/ce417316