2010-11-11 9 views
11

comportamiento inesperado:secuencia de Oracle a partir de 2 en lugar de 1

me encuentro con el extraño comportamiento de las secuencias de Oracle 11g (trabaja con 10 g):

CREATE SEQUENCE test_sequence START WITH 1; 
CREATE TABLE test_table (val INT); 

INSERT INTO test_table VALUES (test_sequence.NEXTVAL); 

A pesar de que la la secuencia comienza con , el primer valor insertado es :

SELECT * FROM test_table; 

     VAL 
---------- 
     2 

comportamiento esperado:

Selección NEXTVAL sin el inserto funciona como se espera:

CREATE SEQUENCE test_sequence_2 START WITH 1; 

SELECT test_sequence_2.NEXTVAL FROM dual 

    NEXTVAL 
---------- 
     1 

Pregunta:

¿Alguien puede reproducir esto usando Oracle 11g? ¿Es esto un problema conocido?

Estoy usando
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production.

+1

Devuelve '' 1' en mi base de datos Oracle 11g versión 11.1.0.6.0 - 64 bits producción' – Quassnoi

+1

@Quassnoi: esto parece ser una "característica" de '11.2 '(ver la respuesta de Jeffrey). Gracias por probar! –

Respuesta

16

Ésta es documented in the 11.2 SQL Language Reference donde dice,

Si intenta insertar un valor de secuencia en una tabla que utiliza la creación de segmentos diferido, el primer valor que la secuencia de las devoluciones se omiten.

Consulte el enlace en la respuesta de Jeffrey Kemp para una nota de My Oracle Support (Metalink) y una solución.

3

No puedo reproducir en 11G, es decir, la tabla contiene un 1 después de seguir sus pasos.

Sin embargo, es discutible si esto debe considerarse un "problema", ya que nunca se garantiza que las secuencias estén libres de huecos. Lo que START WITH garantiza es que la secuencia nunca devolverá un valor inferior a que el valor de inicio especificado, p. para evitar conflictos con los datos existentes. Sin embargo, estoy de acuerdo en que lo que estás viendo es sorprendente y ¡me interesaría saber la razón!

7

Diría que la causa es esta "función no documentada". Consulte el documento de soporte de My Oracle ID 1273858.1 (que desafortunadamente está detrás de un muro de pago y no se puede copiar aquí).

Pruébelo sin la creación de segmentos diferidos y vea si el problema persiste.

1

Uso:

CREATE SEQUENCE SQ_SEQUENCE_NAME 
    INCREMENT BY 1 
    START WITH 1 
    MINVALUE 0 -- This will ensure start at 1! 
    MAXVALUE 99 
    NOCYCLE 
    NOCACHE 
    ORDER; 
Cuestiones relacionadas