Questão de Banco de Dados — PostgreSQL — CESPE / CEBRASPE 2024
Banco de Dados›PostgreSQL
Código
ce403665
Banca
CESPE / CEBRASPE
Órgão
TSE
Ano
2024
Cargo
AJ
Julgue o item seguinte, a respeito de H2 Database e de PostgreSQL.
CREATE TABLE cidade ( nome varchar(40), codigo int );
CREATE TABLE capital ( UF char(2) UNIQUE NOT NULL ) #XPTO (cidade);
insert into capital values ('Brasília', 22, 'DF'); select * from capital;
No script precedente, desenvolvido em SQL no PostgreSQL, a substituição dos caracteres #XPTO por References fará que a execução do script apresente o seguinte resultado.
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”.
PostgreSQL – Chave Estrangeira e Herança de Tabelas
Gabarito: Errado. A substituição de #XPTO por REFERENCES não produzirá o resultado apresentado, pois a sintaxe REFERENCES cidade sem a cláusula FOREIGN KEY e sem a definição de coluna correspondente não cria uma chave estrangeira válida — além disso, a tabela capital herda de cidade, o que altera a estrutura e o resultado do SELECT.
O cerne da questão está em dois pontos: a sintaxe correta para definir uma chave estrangeira no PostgreSQL e o efeito da herança de tabelas. No PostgreSQL, uma chave estrangeira é definida com a cláusula FOREIGN KEY (coluna) REFERENCES tabela(coluna). A simples substituição de #XPTO por REFERENCES cidade — sem especificar a coluna que referencia — é inválida e gerará erro de sintaxe. Além disso, a tabela capital é criada com (cidade), o que a torna uma tabela filha de cidade, herdando suas colunas (nome e codigo). Assim, mesmo que a sintaxe fosse corrigida, o SELECT * FROM capital retornaria as colunas herdadas (nome, codigo) mais a coluna própria (uf), não apenas nome, codigo e uf como apresentado — e a ordem das colunas seria nome, codigo, uf, não nome | codigo | uf.
Para entender completamente, é preciso dominar dois conceitos:
Chave estrangeira: é uma restrição que garante a integridade referencial entre duas tabelas. A sintaxe correta no PostgreSQL é:
A cláusula REFERENCES sozinha, sem FOREIGN KEY, não é uma definição válida de chave estrangeira — ela só pode aparecer como parte da definição de uma coluna, como coluna tipo REFERENCES tabela(coluna), mas mesmo assim exige a coluna correspondente.
Herança de tabelas: no PostgreSQL, uma tabela pode herdar de outra usando INHERITS (tabela_pai). A tabela filha herda todas as colunas da tabela pai, além das suas próprias. No script, CREATE TABLE capital (...) INHERITS (cidade) faz com que capital tenha as colunas nome, codigo (herdadas) e uf (própria). O SELECT * FROM capital retornaria as colunas na ordem: primeiro as herdadas (nome, codigo), depois as próprias (uf).
Vamos analisar o script passo a passo:
CREATE TABLE cidade (nome varchar(40), codigo int); — cria a tabela cidade com duas colunas.
CREATE TABLE capital (UF char(2) UNIQUE NOT NULL) INHERITS (cidade); — cria a tabela capital com a coluna uf e herda nome e codigo de cidade.
INSERT INTO capital VALUES ('Brasília', 22, 'DF'); — insere uma linha com os valores para nome, codigo e uf.
SELECT * FROM capital; — retorna as colunas nome, codigo, uf.
Mas o enunciado apresenta nome | codigo | uf — que é exatamente o que aconteceria com a herança. No entanto, a substituição de #XPTO por REFERENCES não é suficiente para criar a herança; a sintaxe correta para herança é INHERITS (cidade), não REFERENCES cidade. Portanto, o script com REFERENCES não executaria corretamente — geraria erro de sintaxe.
A pegadinha da banca está em confundir REFERENCES (usado para chave estrangeira) com INHERITS (usado para herança). O candidato que conhece a sintaxe de chave estrangeira pode até achar que REFERENCES cidade é válido, mas sem a cláusula FOREIGN KEY e sem a coluna correspondente, não é. E mesmo que fosse, o resultado do SELECT não seria o apresentado, pois a herança não é criada por REFERENCES.
NÃO CAIA NESSA!
A banca troca INHERITS por REFERENCES para confundir. REFERENCES é usado em chave estrangeira, mas sozinho não cria herança. A herança exige INHERITS (tabela_pai). Além disso, a ordem das colunas no SELECT * é nome, codigo, uf — não nome | codigo | uf como apresentado.
Critério
REFERENCES cidade (substituição proposta)
INHERITS (cidade) (herança real)
Sintaxe válida no PostgreSQL
❌ Inválida – REFERENCES sozinho, sem FOREIGN KEY e sem coluna correspondente, gera erro de sintaxe
✅ Válida – INHERITS (tabela_pai) é a sintaxe correta para herança
Efeito na estrutura da tabela capital
Não cria herança; a tabela teria apenas a coluna uf (se a sintaxe fosse corrigida)
Herda colunas nome e codigo da tabela cidade, além da própria uf
Colunas retornadas por SELECT *
Apenas uf (ou erro de execução)
nome, codigo, uf (nesta ordem)
Resultado do script
Erro de sintaxe – não chega ao INSERT/SELECT
CREATE TABLE, CREATE TABLE, INSERT 0 1, e SELECT retornando as 3 colunas
Item — ❌ Errado
A afirmação está errada porque a substituição de #XPTO por REFERENCES não produzirá o resultado apresentado. O script com REFERENCES cidade é sintaticamente inválido — falta a cláusula FOREIGN KEY e a coluna que referencia. Mesmo que fosse corrigido para FOREIGN KEY (codigo) REFERENCES cidade(codigo), a tabela capital não herdaria as colunas de cidade; ela teria apenas uf e a chave estrangeira. O SELECT * FROM capital retornaria apenas uf, não nome, codigo e uf. Para obter o resultado apresentado, seria necessário usar INHERITS (cidade), não REFERENCES.