Definição da coluna SQL: valor padrão e não redundante nulo?

86

Já vi muitas vezes a seguinte sintaxe que define uma coluna em uma instrução de criação / alteração de DDL:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"

A questão é: como um valor padrão é especificado, é necessário especificar também que a coluna não deve aceitar NULLs? Em outras palavras, DEFAULT não torna NOT NULL redundante?

Razvan
fonte

Respostas:

126

DEFAULTé o valor que será inserido na ausência de um valor explícito em uma instrução de inserção / atualização. Vamos supor que seu DDL não tenha a NOT NULLrestrição:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault"

Então você poderia emitir essas declarações

-- 1. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);

-- 2. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);

-- 3. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;

-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);

Como alternativa, você também pode usar DEFAULTem UPDATEinstruções, de acordo com o padrão SQL-1992 :

-- 5. This will update "MyDefault" into tbl.col
UPDATE tbl SET col = DEFAULT;

-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;

Observe que nem todos os bancos de dados oferecem suporte a todas essas sintaxes padrão SQL. Adicionar a NOT NULLrestrição causará um erro nas instruções 4, 6, embora 1-3, 5ainda sejam instruções válidas. Portanto, para responder à sua pergunta: Não, eles não são redundantes.

Lukas Eder
fonte
Fui ao seu link (para a postagem do seu blog) esperando ver uma explicação (possivelmente com alguns números) do tremendo impacto no desempenho da consulta, mas apenas vi uma breve reafirmação de que tem um impacto. Sem ofensa, mas o link é um pouco enganador.
Seth Flowers de
@SethFlowers: Obrigado pelo ponteiro, Seth. O artigo vinculado foi editado nesse meio tempo. Vou ver se consigo criar um link para outra coisa ou remover o link. Do jeito que está agora, você está absolutamente certo, isso não agrega nenhum valor à resposta aqui.
Lukas Eder de
Obrigado - espero não ter soado rude. Acabei de ver o link e pensei "sim, é definitivamente algo que eu quero ler" - então fiquei um pouco desapontado :).
Seth Flowers de
@SethFlowers: Não se preocupe. Eu concordo completamente. Para meu resgate: Minhas habilidades de blog melhoraram muito nos últimos anos :)
Lukas Eder
19

Mesmo com um valor padrão, você sempre pode substituir os dados da coluna por null.

A NOT NULLrestrição não permitirá que você atualize essa linha após ela ter sido criada com o nullvalor

Tamir
fonte
Eu acho que isso deveria ser reformulado: "A restrição NOT NULL não permitirá que você atualize essa linha depois que ela foi criada com valor nulo" É claro que linhas com colunas NOT NULL podem ser atualizadas, elas simplesmente não podem ser atualizadas com null como um valor para essa coluna. Além disso: presumo que criar uma linha significa inserir uma linha. As instruções INSERT também não podem ter valores nulos para colunas especificadas com NOT NULL.
março de
4

Meu professor de SQL disse que se você especificar um DEFAULTvalor e NOT NULLou NULL, DEFAULTsempre deve ser expresso antes de NOT NULLou NULL.

Como isso:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL

Tanguy Labrador Ruiz
fonte
5
Olá, obrigado por participar. No entanto, isso não resolve a questão em questão e as duas ordens são completamente eficazes. Acho mais fácil colocar o padrão no final quando estou criando scripts de tabelas manualmente, porque então os valores NULL e NOT NULL se alinham melhor.
emragins
Ok, acho que você também está certo. Não entendo por que meu curso diz explicitamente o que escrevi em minha resposta. Sei que minha resposta não aborda realmente a pergunta, mas descobri que um comentário não seria muito legível.
Tanguy Labrador Ruiz
3
Há uma diferença entre as melhores práticas e regras (subjetivas). Não é uma má ideia ter um estilo consistente, mas, neste caso específico, eu pessoalmente preferiria NOT NULL antes de DEFAULT. Independentemente disso, você também pode escrever comentários em vez de respostas, isso teria sido mais apropriado.
março de
Isso provavelmente não responde à pergunta. Mas isso é exatamente o que eu estava procurando. Obrigado.
Sasuke Uchiha
2

Eu diria que não.

Se a coluna aceitar valores nulos, não há nada que o impeça de inserir um valor nulo no campo. Até onde sei, o valor padrão só se aplica na criação de uma nova linha.

Com o conjunto não nulo, você não pode inserir um valor nulo no campo, pois isso gerará um erro.

Pense nisso como um mecanismo à prova de falhas para evitar nulos.

Dark Hippo
fonte
2
Você disse 'criação de uma nova regra'. Você pretendia dizer 'criação de uma nova linha'?
bielawski de
Acho que essa é uma resposta mais prática a essa pergunta.
Noman_ibrahim
@bielawski E quase 8 anos depois, consegui corrigir esse erro de digitação :)
Dark Hippo
Esta deve ser a resposta aceita. OP faz uma pergunta simples e a resposta é simplesmente "não". Explicação e exemplo são necessários para a documentação.
Nicolas Hevia