domingo, 27 de novembro de 2011

Insert: valores default e nulos

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