Como estudante de CS, aprendi um número decente de linguagens de programação ao longo dos anos, a maioria das quais teve algum conceito de tipo "anulável" ou "opcional". Note que estou não falar de ponteiros nulos ou referências, ou linguagens fracamente tipadas como JavaScript, onde tudo pode ser null
. Exemplos do que estou falando incluem boost::optional
(C ++), java.util.Optional
(Java 8.0), prelude.Maybe
(Haskell) e todos os '?' tipos (por exemplo int?
, float?
C # e Kotlin). Essas são construções que adicionam capacidade de anulação a um tipo anteriormente não anulável em um sistema de tipo estático estrito.
O SQL tem um conceito semelhante: um tipo como INTEGER
pode ser anulável ou não anulável - mas há uma diferença. No SQL, INTEGER
é anulável por padrão e deve ser explicitamente gravada como INTEGER NOT NULL
para não ser anulável.
Parece-me extremamente contra-intuitivo e potencialmente perigoso por permitir que o NULL seja o comportamento padrão. Obviamente, o SQL existe há tanto tempo neste ponto que (a maioria) os desenvolvedores de SQL desenvolveram uma percepção saudável das armadilhas do NULL. Mas não posso deixar de imaginar que, nos primeiros dias, os NULL costumavam aparecer em lugares inesperados e problemáticos.
O SQL antecede todos os exemplos que forneci, portanto, é possível que isso seja apenas uma questão de evolução histórica. Ainda assim, devo perguntar, existe alguma boa razão para o idioma ser projetado dessa maneira, com tipos sendo anuláveis por padrão?
Em caso afirmativo, é apenas uma razão histórica ou a lógica é válida para o design de banco de dados hoje?
Edit: Não estou perguntando por que NULL faz parte do SQL ou por que colunas anuláveis são úteis. Estou apenas perguntando por que a coluna é anulável por padrão . Por exemplo, por que escrevemos:
column1 FLOAT,
column2 FLOAT NOT NULL
Ao invés de:
column1 FLOAT NULLABLE,
column2 FLOAT