Perguntas e respostas para SQL Server migradas aqui desta pergunta .
O que acontece se uma restrição "NOT NULL" for adicionada a uma tabela para uma coluna que já possui valores NULL?
Perguntas e respostas para SQL Server migradas aqui desta pergunta .
O que acontece se uma restrição "NOT NULL" for adicionada a uma tabela para uma coluna que já possui valores NULL?
A questão:
Um exemplo simples no SQL Server é uma restrição para não permitir NULLs.
Crie uma tabela e insira duas linhas, uma não nula e outra nula.
A
ALTER TABLE
sintaxe pode direcionar o que acontece quando você cria a restrição. O usoWITH NOCHECK
dirá ao mecanismo (vroom vroom) para não verificar o conteúdo da coluna, mas apenas para adicionar a restrição para linhas futuras.A adição dessa restrição é executada com êxito, mas significa que a restrição não é confiável e você perde certas otimizações de consulta. Por exemplo, se esta fosse uma chave estrangeira, você perderia a eliminação de junção. Para uma restrição de coluna, o otimizador pode pular qualquer período de trabalho se as informações de restrição informarem que uma pesquisa não produzirá resultados.
Mas agora esta inserção falha:
Você também pode direcionar o mecanismo (bip bip) para verificar os valores da coluna enquanto adiciona a restrição.
Adicionar essa restrição falhará.
Se você adicionar um sem direção formal (pelo menos para restrições de verificação de coluna), o mecanismo (screeeeech) lançará um erro.
Um exemplo do tipo de otimização que você pode obter com uma restrição confiável é assim:
Em vez de procurar valores, o mecanismo (honk honk) sabe que tal valor não pode existir devido à restrição confiável. Em vez de montar um plano de consulta 'real' e ler quaisquer dados, o otimizador faz um curto-circuito e usa um operador Constant Scan para retornar NADA!