Este post tem por objetivo esclarecer um pequeno erro, mas infelizmente comum, relativo ao comando INSERT, valores default e nulos.
Comecemos pela declaração da tabela. Como é fácil notar, a terceira coluna chama-se dtNasc e tem sysdate como valor default.
create table pessoa
(id number primary key,
nome varchar2(50),
dtNasc date default trunc(sysdate));
Agora uma pequena sequencia de INSERTs, com uma alteração na foram como valores são inseridos na coluna dtNasc:
insert into pessoa(id, nome, dtnasc)
values(1, 'João', trunc(sysdate-20) );
insert into pessoa(id, nome)
values(2, 'Maria');
insert into pessoa(id, nome, dtnasc)
values(3, 'João', null );
commit;
E para ver o resultado, um SELECT:
select * from pessoa;
ID NOME DTNASC
----- ---------- ------------
1 João 06-NOV-11
2 Maria 26-NOV-11
3 João
O primeiro INSERT define claramente um valor para dtNasc, no caso 06-NOV-2011, sobrescrevendo o valor default.
O segundo nem inclui a coluna na lista, muito menos define um valor. Neste caso, o valor default é assumido.
Já o terceiro também define explicitamente o valor NULL. A intenção do usuário é clara: o valor é desconhecido, não assuma o valor default. Este é justamente o erro que comentei no início, pois muitos assumem que seria definido o valor default.
Se já pode causar alguma confusão quando utilizando diretamente SQL, mais atenção é necessária quando a aplicação é desenvolvida com Hibernate ou algum outro framework para acesso a dados por que há diferenças no comportamento se a coluna está ou não mapeada e como certos parâmetros do framework são setados. Não vou entrar nas várias alternativas de cada framework, mas é importante estar atento.
Nenhum comentário:
Postar um comentário