› Fóruns › Banco de dados Oracle › Problema com sequence no 11g › Problema com sequence no 11g
Acho que o diegolenhardt matou a questão.
Realmente o parâmetro deferred_segment_creation mudou o comportamento, mas um detalhe, nada mudou em relação a sequence, o que mudou foi em relação as tabelas não particionadas e objetos dependentes da tabela como lob e índices, a tabela só é criada de fato, após a primeira inserção de registro.
Retirado da documentação oficial:
DEFERRED_SEGMENT_CREATION
Property Description
Parameter type Boolean
Default value true
Modifiable ALTER SESSION, ALTER SYSTEM
Range of values true | false
Basic No
DEFERRED_SEGMENT_CREATION specifies the semantics of deferred segment creation. If set to true, then segments for non-partitioned tables and their dependent objects (LOBs, indexes) will not be created until the first row is inserted into the table.
Before creating a set of tables, if it is known that a significant number of them will not be populated, then consider setting this parameter to true. This saves disk space and minimizes install time.
Fiz alguns testes para entender melhor como funciona o parâmetro, por padrão ele é verdadeiro.
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as sakamoto
SQL> CREATE TABLE TABELA_TST (ID NUMBER(10) NOT NULL);
Table created
SQL> CREATE SEQUENCE SEQ_TABELA_TST INCREMENT BY 1 START WITH 1 MAXVALUE 9999999999 NOCYCLE CACHE 20;
Sequence created
SQL> INSERT INTO TABELA_TST (ID) VALUES (100);
1 row inserted
SQL> COMMIT;
Commit complete
SQL> SELECT T.ID FROM TABELA_TST T;
ID
100
SQL> INSERT INTO TABELA_TST (ID) VALUES (SEQ_TABELA_TST.NEXTVAL) ;
1 row inserted
SQL> COMMIT;
Commit complete
SQL> SELECT T.ID FROM TABELA_TST T;
ID
100
1
Repare que eu inseri o primeiro registro com valor 100 para sabermos que foi gerado na mão, e não pela sequence. Neste momento a tabela foi criada de fato, em seguida inseri utilizando a sequence, veja que foi inserido o valor 1.
O que acontece quando tentamos inserir direto o primeiro registro vindo da sequence ? Provavelmente a sequence gera o valor 1 e tenta inserir na tabela, por algum motivo a inserção falha, é quando a tabela é criada de verdade, então é tentado inserir novamente, é gerado o valor 2, então é inserido com sucesso.
Pelos testes foi isso que eu conclui, posso estar falando besteira… ^^