SQL: ALTER TABLE ADD e o valor padrão de coluna NOT NULL
Gabarito: letra A. O script executa com sucesso: o comando ALTER TABLE ... ADD atr4 INT NOT NULL DEFAULT 0 cria uma nova coluna atr4 e, como a tabela já possui duas tuplas, o SGBD preenche automaticamente o novo atributo com o valor padrão 0 (zero) em ambas as linhas existentes. A alternativa correta descreve exatamente esse comportamento.
O comando ALTER TABLE é um comando da sublinguagem DDL (Data Definition Language), responsável por modificar a estrutura de uma tabela existente. A cláusula ADD é utilizada para adicionar uma nova coluna, e a sintaxe básica é ALTER TABLE nome_tabela ADD nome_coluna tipo_dado [restrições]. A palavra COLUMN é opcional na maioria dos SGBDs, como PostgreSQL, MySQL e SQL Server — ou seja, ADD COLUMN atr4 e ADD atr4 são equivalentes. A restrição NOT NULL impede que a coluna aceite valores nulos, e a cláusula DEFAULT 0 define o valor padrão que será usado quando nenhum valor for fornecido explicitamente.
Quando se adiciona uma coluna com NOT NULL a uma tabela que já contém dados, o SGBD precisa atribuir um valor a essa coluna nas linhas existentes. Se a coluna tiver uma cláusula DEFAULT, o SGBD usa esse valor padrão para preencher as tuplas já presentes. Sem a cláusula DEFAULT, a operação falharia, pois não haveria como garantir a restrição NOT NULL para os registros existentes. No script da questão, a presença de DEFAULT 0 garante que as duas tuplas existentes recebam o valor 0 na nova coluna atr4.
O comando INSERT subsequente insere uma nova tupla com valores explícitos para as colunas atr1, atr2 e atr3. Como a coluna atr4 tem DEFAULT 0, ela será preenchida com 0 automaticamente. O valor NULL em atr3 na segunda tupla do INSERT não causa erro, pois a restrição NOT NULL não foi aplicada a atr3 na criação da tabela — apenas a coluna atr4 possui essa restrição. Portanto, o script é válido e produz o resultado descrito na alternativa A.
A pegadinha central desta questão está na confusão entre a sintaxe do ALTER TABLE e o comportamento do SGBD ao adicionar uma coluna NOT NULL com DEFAULT em uma tabela populada. Muitos candidatos acreditam que a palavra COLUMN é obrigatória ou que a operação falharia, mas a sintaxe correta aceita ambas as formas, e o DEFAULT resolve o problema do preenchimento das tuplas existentes.
Alternativa A — ✅ Correta ⟵ GABARITO
A alternativa descreve com precisão o resultado da execução do script. O comando ALTER TABLE adiciona a coluna atr4 com a restrição NOT NULL e o valor padrão DEFAULT 0. Como a tabela já contém duas tuplas, o SGBD preenche automaticamente o novo atributo com o valor 0 em ambas as linhas. O comando INSERT subsequente adiciona uma nova tupla, e a coluna atr4 também recebe o valor 0 por padrão. Ao final, a tabela possui três tuplas, todas com atr4 = 0.
Alternativa B — ❌ Incorreta
A alternativa confunde o conceito de coluna com o de restrição de integridade. atr4 é uma coluna (atributo) adicionada à tabela, não uma restrição. A restrição NOT NULL é uma propriedade da coluna, mas a coluna em si é o que está sendo criado. Além disso, a descrição "demanda que valores não nulos sejam inicialmente preenchidos com o valor zero" é confusa e não reflete o comportamento real: o DEFAULT 0 preenche as tuplas existentes com zero, mas a coluna pode receber outros valores em inserções futuras.
Alternativa C — ❌ Incorreta
A afirmação de que o ALTER TABLE apresentará erro é falsa. A especificação SQL permite adicionar uma nova coluna com a restrição NOT NULL, desde que um valor padrão seja fornecido (via DEFAULT) ou que a tabela esteja vazia. Como o script inclui DEFAULT 0, a operação é válida e não gera erro. A alternativa ignora a cláusula DEFAULT, que é exatamente o que torna a operação possível.
Alternativa D — ❌ Incorreta
A alternativa afirma que o INSERT não será executado porque a segunda tupla contém valor nulo em atr3. No entanto, a coluna atr3 não possui a restrição NOT NULL — ela foi criada sem essa restrição no CREATE TABLE. Portanto, valores nulos são permitidos em atr3, e o INSERT é executado normalmente. A restrição NOT NULL se aplica apenas à coluna atr4, que não é mencionada no INSERT e, por isso, recebe o valor padrão 0.
Alternativa E — ❌ Incorreta
A alternativa alega que há um erro sintático pela ausência da palavra COLUMN após ADD. Isso é incorreto: a palavra COLUMN é opcional na sintaxe do ALTER TABLE na maioria dos SGBDs. Tanto ADD COLUMN atr4 quanto ADD atr4 são formas válidas. O script está sintaticamente correto, e a execução não gera erro.
Gabarito: letra A