Questão de Banco de Dados — SQL — FGV 2022
- Código
- fg047175
- Banca
- FGV
- Órgão
- CGU
- Ano
- 2022
- Nível
- Superior
- Cargo
- Auditor Federal de Finanças e Controle - Tecnologia da Informação
- A0
- BNULL
- C1
- D3
- E6
GabaritoB — NULL
Gabarito: letra B (NULL). O TRUNCATE TABLE remove todas as linhas e reinicia o contador da coluna IDENTITY para o valor inicial (1). Já o DELETE remove linhas, mas não reseta o contador. Ao final do script, após o último TRUNCATE, a tabela está vazia, portanto MAX(C1) retorna NULL.
A questão testa a diferença entre os comandos DELETE e TRUNCATE em relação à coluna IDENTITY. No SQL Server, TRUNCATE é um comando DDL que libera as páginas de dados e redefine o valor de seed da identidade. DELETE é DML, apenas remove registros, mantendo o último valor de identidade na memória.
Vamos simular o script passo a passo:
create table XPTO (C1 int identity, C2 varchar(16)) → tabela criada, seed=1, incremento=1.
Insere 'A' → C1=1.
Insere 'B' → C1=2.
Insere 'C' → C1=3.
truncate table XPTO → tabela vazia, seed volta a 1.
Insere 'D' → C1=1 (novo seed).
Insere 'E' → C1=2.
delete from XPTO → tabela vazia, seed permanece 3 (próximo valor serializado).
truncate table XPTO → tabela vazia, seed volta a 1.
Insere 'F' → C1=1.
truncate table XPTO → tabela vazia, seed volta a 1.
select max(C1) from XPTO → sem linhas, função de agregação retorna NULL.
A função MAX() sobre um conjunto vazio retorna NULL em SQL (padrão ANSI).
Comando | Efeito na tabela | Efeito no contador IDENTITY | Resultado de |
|---|---|---|---|
| Remove todas as linhas | Reinicia para o valor inicial (1) |
|
| Remove todas as linhas | Não reinicia; mantém o último valor |
|
| Adiciona uma linha | Incrementa normalmente | Valor da linha inserida |
Estado final do script | Tabela vazia (após último | Reiniciado para 1 |
|
Apresenta 0, que não é um valor possível. MAX de conjunto vazio não é 0, nem mesmo quando há valor padrão.
Após o último TRUNCATE, a tabela não tem registros. MAX(C1) retorna NULL.
Valor 1 seria o primeiro registro após o último truncate, mas o truncate removeu esse registro.
Valor 3 seria o maior se o script parasse após a inserção de 'C' e antes de truncar. Mas houve remoções posteriores.
Valor 6 nunca foi gerado. O contador máximo foi 3 e depois resetado.
A banca explora a confusão entre DELETE e TRUNCATE. Muitos candidatos pensam que DELETE também reseta a identidade, mas no SQL Server apenas TRUNCATE o faz. Outro ponto: o último comando é TRUNCATE, não DELETE, então a tabela fica vazia e não há valor máximo possível.
Gabarito: letra B.
Link permanente: /questoes/fg047175