Questão nº 52
Questão de Tecnologia da Informação · CESGRANRIO BASA 02/2021 (nº 52)
As tabelas a seguir fazem parte do banco de dados da área de recursos humanos de uma empresa. Elas registram os
dados referentes aos empregados e aos seus dependentes.
CREATE TABLE EMPREGADO (
MATRICULA INTEGER NOT NULL,
NOME TEXT NOT NULL,
DATA_NASC TEXT NOT NULL,
CERT_RESRV INTEGER UNIQUE NULL,
PRIMARY KEY (MATRICULA));
CREATE TABLE DEPENDENTE (
MAT_EMP INTEGER NOT NULL,
NUM_SEQ INTEGER NOT NULL,
NOME TEXT NOT NULL,
DATA_NASC TEXT NOT NULL,
PRIMARY KEY (MAT_EMP, NUM_SEQ)
FOREIGN KEY (MAT_EMP)
REFERENCES EMPREGADO (MATRICULA));
O estado corrente desse banco de dados é exibido nas figuras abaixo.


Qual comando INSERT irá falhar, na tentativa de incluir uma nova linha em uma das tabelas desse banco de dados?
- A```sql
INSERT INTO DEPENDENTE(NUM_SEQ,MAT_EMP,DATA_NASC,NOME)
VALUES(00,11111,datetime('2015-01-06'),'Luiz Paulo');
``` - B```sql
INSERT INTO DEPENDENTE(NOME,DATA_NASC,NUM_SEQ,MAT_EMP)
VALUES('Maria Paula',datetime('2017-08-11'),3,11111);
``` - C```sql
INSERT INTO EMPREGADO VALUES(55555,'Antônia Pinto',datetime('1994-04-01'),NULL);
``` - D```sql
INSERT INTO EMPREGADO VALUES(66666,'Adriana Andrade',datetime('1985-06-04'));
``` (alternativa correta) - E```sql
INSERT INTO EMPREGADO VALUES(44444,'Nilce Peçanha',datetime('1999-09-06'),'');
```
Resposta comentada
Gabarito Alternativa D
Conceito-chave: Em SQL, a ordem e a quantidade de valores no INSERT devem corresponder exatamente à estrutura da tabela. Se você omitir uma coluna, o banco tentará usar o valor padrão (NULL ou o definido), mas se a coluna não tiver valor padrão e for NOT NULL, o comando falha. A pegadinha aqui é que a tabela EMPREGADO tem 4 colunas (MATRICULA, NOME, DATA_NASC, CERT_RESRV), e a alternativa D só fornece 3 valores, tentando inserir sem o campo CERT_RESRV, que é opcional (aceita NULL), mas a sintaxe está errada porque não especifica as colunas.
- (A) Incorreta: O
INSERTespecifica as colunas e fornece 4 valores, incluindoNUM_SEQ=00(que é válido, pois é inteiro) eMAT_EMP=11111(que existe na tabelaEMPREGADO). A funçãodatetime()gera texto válido paraDATA_NASC. A ordem das colunas na lista é respeitada, então não há erro. - (B) Incorreta: A ordem das colunas na lista é diferente da ordem na tabela, mas como o
INSERTnomeia explicitamente as colunas (NOME, DATA_NASC, NUM_SEQ, MAT_EMP), os valores são mapeados corretamente. OMAT_EMP=11111existe, e oNUM_SEQ=3é válido. Não há violação de chave estrangeira nem de chave primária. - (C) Incorreta: O
INSERTfornece 4 valores na ordem correta da tabela (MATRICULA, NOME, DATA_NASC, CERT_RESRV). OCERT_RESRVéNULL, que é permitido (a coluna aceitaNULL). A matrícula55555é nova, então não viola a chave primária. - (D) Correta: Este comando omite a coluna
CERT_RESRVe não especifica a lista de colunas. O SQL espera 4 valores (pois a tabela tem 4 colunas), mas recebe apenas 3. Isso gera erro de sintaxe/contagem de valores, pois o banco não sabe como preencher a coluna faltante sem um valor padrão explícito. Armadilha da banca: o aluno pode pensar que, comoCERT_RESRVaceitaNULL, o banco preencheria automaticamente, mas sem a lista de colunas, oINSERTexige o valor para todas as colunas, mesmo que sejaNULLescrito explicitamente. - (E) Incorreta: O
INSERTfornece 4 valores, incluindoCERT_RESRVcomo string vazia''. Isso é aceito, pois a coluna éTEXTe aceita qualquer texto (inclusive vazio). A matrícula44444é nova, então não viola a chave primária.
Fonte: CESGRANRIO BASA 02/2021 Técnico Científico - Tecnologia da Informação. Reproduzida para fins de estudo.