Oracle 12c - Colunas do tipo auto-incremento (IDENTITY)

Pessoal,

Bom dia!
Outra novidade do Oracle 12c além da utilização do valor de uma sequence como valor default em uma coluna de uma tabela são as colunas do tipo Auto-Incremento (IDENTITY).

Segue abaixo alguns exemplos práticos dos tipos de coluna IDENTITY que podemos criar à partir do Oracle 12c.



GENERATED ALWAYS AS IDENTITY

SQL> create table t1_always (   
2    id number GENERATED ALWAYS AS IDENTITY,
3    nome varchar2(20)  
4  );

Tabela criada.

SQL> desc t1_always

Nome              Nulo?    Tipo 
----------------- -------- -----------------------
ID                NOT NULL NUMBER
NOME                       VARCHAR2(20)

Podemos notar pelo resultado do comando DESCRIBE acima, que uma coluna IDENTITY é obrigatória (NOT NULL). Abaixo podemos ver que o Oracle automaticamente criou uma SEQUENCE de banco de dados com o nome de ISEQ$$_19860.

SQL> select sequence_name  from user_sequences;


SEQUENCE_NAME 
----------------- 
ISEQ$$_19860

Se por acaso tentarmos dropar essa SEQUENCE, o Oracle irá emitir o erro ORA-32794, ou seja, diferentemente de especificar uma SEQUENCE como DEFAULT em uma coluna, onde não há qualquer dependência entre a SEQUENCE e a coluna da tabela, no caso de uma coluna do tipo IDENTITY a SEQUENCE que é criada automaticamente faz parte dessa engenharia.

SQL> drop sequence ISEQ$$_19860; 
drop sequence ISEQ$$_19860 * ERRO na linha 1: ORA-32794: não é possível eliminar uma sequência gerada pelo sistema

Uma coluna IDENTITY criada com a cláusula ALWAYS sempre irá forçar a geração do valor sequencial. Caso algum valor seja informado na coluna IDENTITY, o erro ORA-32795 será emitido.

SQL> insert into t1_always values (1,'teste1');
insert into t1_always values (1,'teste1') * ERRO na linha 1: ORA-32795: não é possível inserir em uma coluna de identidade sempre gerada

GENERATED BY DEFAULT AS IDENTITY

Uma coluna IDENTITY criada com a cláusula BY DEFAULT não irá forçar a geração do valor sequencial, ou seja, caso algum valor seja informado na coluna IDENTITY, o mesmo será inserido ao invés do valor sequencial.

SQL> create table t2_by_default (   
2    id number GENERATED BY DEFAULT AS IDENTITY,   
3    nome varchar2(20)   
4  ); 

Tabela criada. 

SQL> insert into t2_by_default values (11,'teste11'); 

1 linha criada.

GENERATED BY DEFAULT ON NULL AS IDENTITY

Uma coluna IDENTITY criada com a cláusula BY DEFAULT ON NULL não irá forçar a geração do valor sequencial, ou seja, caso algum valor seja informado na coluna IDENTITY, o mesmo será inserido ao invés do valor sequencial. Caso NULL seja informado, então o valor sequencial será gerado para a coluna.

SQL> create table t3_by_default_on_null (   
2    id number GENERATED BY DEFAULT ON NULL AS IDENTITY,   
3    nome varchar2(20)   
4  ); 

Tabela criada.

SQL> insert into t3_by_default_on_null (nome) values ('teste1');

1 linha criada.

SQL> insert into t3_by_default_on_null (id,nome) values (11,'teste11');

1 linha criada.

SQL> insert into t3_by_default_on_null (id,nome) values (NULL,'teste200');

1 linha criada.

SQL> select * from t3_by_default_on_null;

ID NOME
---------- --------------------
1 teste1
11 teste11
2 teste200

Abraço,

Ronaldo

Nenhum comentário:

Postar um comentário