DDL – CREATE TABLE com chave primária composta e chaves estrangeiras
Gabarito: letra D. A alternativa D apresenta a sintaxe correta do comando CREATE TABLE para criar a tabela itens_pedido com chave primária composta (pedido_id, produto_id) e chaves estrangeiras definidas inline via REFERENCES, além das restrições CHECK com parênteses. É a única que atende todos os requisitos do enunciado sem erros sintáticos ou conceituais.
A questão exige conhecimento da sintaxe da DDL (Data Definition Language) do SQL padrão, especificamente do comando CREATE TABLE com restrições de integridade: chave primária, chave estrangeira e CHECK. O enunciado pede que a combinação (pedido_id, produto_id) seja a chave primária (garantindo unicidade e NOT NULL implícita) e que pedido_id e produto_id sejam chaves estrangeiras para as tabelas pedidos e produtos, respectivamente.
erDiagram
PEDIDOS ||--o{ ITENS_PEDIDO : "contém"
PRODUTOS ||--o{ ITENS_PEDIDO : "é item de"
ITENS_PEDIDO {
int pedido_id PK, FK
int produto_id PK, FK
int quantidade CHECK(quantidade > 0)
decimal preco_unitario CHECK(preco_unitario > 0)
}
Critério | Alternativa A | Alternativa B | Alternativa C | Alternativa D (Gabarito) | Alternativa E |
|---|
Sintaxe CREATE TABLE | Correta | Incorreta (falta TABLE) | Correta | Correta | Correta |
Chave primária composta | Incorreta (usa UNIQUE, que permite NULL) | Correta (PRIMARY KEY) | Correta (PRIMARY KEY) | Correta (PRIMARY KEY) | Incorreta (usa UNIQUE + coluna extra item_id como PK) |
Chaves estrangeiras | Correta (inline REFERENCES) | Correta (inline REFERENCES) | Incorreta (falta REFERENCES na sintaxe) | Correta (inline REFERENCES) | Correta (inline REFERENCES) |
Restrições CHECK | Correta (com parênteses) | Incorreta (sem parênteses) | Correta (com parênteses) | Correta (com parênteses) | Correta (com parênteses) |
Atende todos os requisitos | ❌ | ❌ | ❌ | ✅ | ❌ |
Alternativa A — ❌ Incorreta
Utiliza UNIQUE (pedido_id, produto_id) em vez de PRIMARY KEY. A restrição UNIQUE permite valores NULL (a menos que as colunas sejam declaradas NOT NULL separadamente), enquanto a PRIMARY KEY exige NOT NULL implicitamente. O enunciado exige que a chave primária garanta "unicidade e não null", portanto a restrição correta é PRIMARY KEY.
Alternativa B — ❌ Incorreta
O comando inicia com CREATE itens_pedido, omitindo a palavra TABLE. A sintaxe padrão SQL é CREATE TABLE nome_da_tabela (...). Além disso, as restrições CHECK estão escritas sem parênteses (CHECK quantidade > 0), o que foge ao padrão (deveria ser CHECK (quantidade > 0)). Embora alguns SGBDs aceitem a omissão, a banca CESPE/CEBRASPE exige a sintaxe formal.
Alternativa C — ❌ Incorreta
A declaração das chaves estrangeiras está incompleta. O correto é FOREIGN KEY (coluna) REFERENCES tabela(coluna). Na alternativa, faltou a palavra REFERENCES antes de pedidos(id) e produtos(id), ficando: FOREIGN KEY (pedido_id) pedidos(id) — o que é inválido.
Alternativa D — ✅ Correta ⟵ GABARITO
Apresenta a sintaxe completa e correta:
CREATE TABLE com o nome da tabela.
Colunas pedido_id e produto_id com REFERENCES inline (forma abreviada de definir chave estrangeira).
quantidade INTEGER CHECK (quantidade > 0) com parênteses.
preco_unitario DECIMAL(10,2) CHECK (preco_unitario > 0).
PRIMARY KEY (pedido_id, produto_id) na definição da tabela, atendendo à exigência de chave primária composta com NOT NULL implícito.
Alternativa E — ❌ Incorreta
Inclui uma coluna extra item_id INTEGER PRIMARY KEY, que torna item_id a chave primária da tabela. O enunciado exige que a chave primária seja a combinação (pedido_id, produto_id). Além disso, a restrição UNIQUE (pedido_id, produto_id) não impede valores NULL e não substitui a PRIMARY KEY.
Gabarito: letra D