Stack Overflow em Português Asked on December 14, 2021
Tenho uma tabela com campos NOT NULL
e elas acabam ficando vazias.
Qual a diferença entre um NULL
(permite valores nulos) e NOT NULL
com uma string vazia (''
) dentro?
Em uma resposta curta eu diria que você deve optar por NULL em colunas que não exigem valor até por questões práticas, por exemplo você não pode inserir um valor "" vazio em um campo date por exemplo, terá que ficar convertendo antes de inserir
Exemplo:
INSERT INTO TABELA (CODKEY, DATA_CAD) VALUES (1, '');
Não conheço todos os bancos mas na maioria tem que ser:
INSERT INTO TABELA (CODKEY, DATA_CAD) VALUES (1, null);
E se fizer:
SELECT * FROM TABELA WHERE (DATA_CAD = '');
Não terá resultados ou receberá um erro de conversão
O correto é
SELECT * FROM TABELA WHERE (DATA_CAD IS NULL);
O mesmo pode ocorrer com outros dados que não seja STRING dados do tipo INT
Apesar da sua pergunta se referir a performance, acho que é praticamente nula a diferença em campos devidamente indexados, então eu levaria mais em conta a normatização dos dados neste caso.
Answered by Marcelo on December 14, 2021
A diferença é que um campo NULL
pode ficar nulo, ou seja, não é obrigatório possuir nenhum valor. E um campo NOT NULL
precisa de algum valor na coluna, seja um string.Empty
ou um ""
.
Creio que se você tem um campo NOT NULL
e insere uma string
vazia dentro, algo está errado na sua arquitetura, pois de nada vale ter um campo NOT NULL
se em algum momento você vai inserir um valor vazio lá dentro. Nesse caso seria melhor transformar esse campo em NULL
.
Quando você insere um valor vazio em alguma coluna no banco que aceita NULL
, seja esse valor um string.Empty
ou ""
, ele entende que isso é um valor vazio, ou seja, tem um valor ali, porém sem nada dentro. Neste caso, você está ocupando espaço do banco, por menor que seja, para armazenar um valor vazio.
Para que o banco continue mostrando NULL
e fique NULL
definitivamente, você insere um valor NULL
que o banco entenda. Algo do tipo:
command.Parameters.AddWithValue("@paymentDate", item.Renavam ?? (object)DBNull.Value);
Ou seja, se o item.Renavam
for nulo, insere um valor null
para o banco, que é o DBNull.Value
. Desta forma, sua coluna ainda ficará como NULL
.
Answered by perozzo on December 14, 2021
Não tem como responder essa pergunta de forma abstrata, até porque isso nada tem a ver com performance. Performance se dará se tudo for feito certo dentro das necessidades. Se precisar de um deles e não do outro, não importa a performance.
Pode haver performance diferente por circunstâncias. A questão deveria ser semântica.
Há quem diga que você nunca precisa de um NULL, mas isso levado a ferro e fogo pode dar problemas de performance porque implica em normalizar em excesso e exigir operações complexas para obter os dados do jeito que precisa.
NULL
significa sem valor, e em branco significa que tem um valor vazio, são coisas diferentes.
Answered by Maniero on December 14, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP