Estoy utilizando Oracle

¿Cuál es la diferencia cuando creamos ID utilizando max(id)+1 y el uso de sequance.nexval,donde a usar y cuándo?

Como:

insert into student (id,name) values (select max(id)+1 from student, 'abc');

y

insert into student (id,name) values (SQ_STUDENT.nextval, 'abc');

SQ_STUDENT.nextval en algún momento da error de registro duplicado…

por favor me ayuden en esta duda

OriginalEl autor Priya Prajapati | 2013-06-20

4 Comentarios

  1. 33

    Con el select max(id) + 1 enfoque, dos sesiones de insertar simultáneamente verá de la misma corriente max ID de la tabla, y ambos insertar el mismo valor de ID. La única forma de utilizar esta seguridad es el bloqueo de la tabla antes de comenzar la transacción, que es dolorosa y serialises las transacciones. (Y como Stijn señala, los valores pueden ser reutilizados si el mayor registro se ha borrado). Básicamente, nunca utilizar este enfoque. (Puede ser en ocasiones una razón de peso para hacerlo, pero no estoy seguro de que yo nunca he visto uno).

    La la secuencia de las garantías que las dos sesiones se obtienen diferentes valores de, y no la seriación es necesario. Se obtienen mejores resultados y ser más seguro, más fácil de código y más fáciles de mantener.

    La única manera que usted puede obtener duplicados de errores utilizando la secuencia es si los registros que ya existen en la tabla con Id por encima de la secuencia de valor, o si todavía le queda algo de insertar registros sin el uso de la secuencia. Así que si usted tenía una tabla existente con introducida manualmente IDs, digamos de 1 a 10, y creó una secuencia predeterminada de inicio-con valor de 1, la primera vez que inserte el uso de la secuencia de intentar insertar un IDENTIFICADOR de 1 – que ya existe. Después de intentar que 10 veces la secuencia de dar 11, que iba a funcionar. Si, a continuación, utiliza el max-ID enfoque para lograr la inserción siguiente que haría uso de la 12, pero la secuencia sería todavía en 11 y también damos 12 la próxima vez que usted llama nextval.

    La secuencia y en la tabla no están relacionadas. La secuencia no se actualiza automáticamente si un manualmente el ID generado por el valor se inserta en la tabla, por lo que los dos enfoques no se mezclan. (Entre otras cosas, la misma secuencia se puede utilizar para generar Identificadores para varias tablas, como se menciona en la documentación).

    Si vas a cambiar de un método manual para una secuencia de enfoque, usted necesita para asegurarse de que la secuencia se crea con una start-con valor que es mayor que todos los Identificadores en la tabla, y que todo lo que hace un insert usa la secuencia sólo en el futuro.

    OriginalEl autor Alex Poole

  2. 10

    El uso de una secuencia funciona si usted tiene la intención de tener varios usuarios. El uso de un max no.

    Si vas a hacer una max(id) + 1 y permitir a varios usuarios, luego de varias sesiones que están funcionando al mismo tiempo regular va a ver el mismo max y, por lo tanto, va a generar la nueva clave. Suponiendo que usted ha configurado su limitaciones correctamente, que generará un error en el que tendrás que manejar. Usted va a manejar por volver a intentar la INSERT que pueden fallar de nuevo y de nuevo, si el resto de las sesiones de bloque antes de su sesión de reintentos pero eso es un montón de código adicional para cada INSERT operación.

    También serializar el código. Si puedo insertar una nueva fila en mi sesión e ir a almorzar antes de recuerdo para cometer (o mi cliente la aplicación se bloquea antes de que pueda cometer), a cada usuario se verá impedido de insertar una nueva fila hasta que yo regrese y cometer o el DBA mata a mi sesión, forzar un reinicio.

    pero alguna vez por qué obtener duplicados de error en el registro, con la secuencia.nextval y funciona al ejecutar la misma consulta con max(id)+1
    debido a que su secuencia de valor actual es menor que el máximo ID en la tabla. La secuencia no se modifica si se inserta manualmente un valor en la tabla. No se deben mezclar los dos enfoques – obtener la secuencia de lo que es superior a los valores de la tabla y, a continuación, utilice únicamente la secuencia.
    Gracias por la respuesta, podría ser el motivo del error

    OriginalEl autor Justin Cave

  3. 4

    Para agregar a las otras respuestas, un par de cuestiones.

    Su max(id)+1 sintaxis también se producirá un error si no hay ninguna fila en la tabla ya, así que uso:

    Coalesce(Max(id),0) + 1

    No hay nada de malo con esta técnica si sólo dispone de un único proceso que se inserta en la tabla, como podría ser el caso de un almacén de datos de la carga, y si max(id) es rápido (que probablemente lo sea).

    También evita la necesidad de que el código de sincronización de valores entre las tablas y secuencias si usted se está moviendo a la restauración de datos a un sistema de prueba, por ejemplo.

    Puede extender este método para insertar varias filas mediante:

    Coalesce(max(id),0) + rownum

    Espero que podrían serialise una inserción en paralelo, aunque.

    Algunas técnicas no funcionan bien con estos métodos. Se basan, por supuesto, ser capaz de emitir la instrucción select, por lo que SQL*Loader podría ser descartada. Sin embargo, SQL*Loader tiene soporte para esta técnica, en general, a través de la SECUENCIA de parámetros de la especificación de columna: http://docs.oracle.com/cd/E11882_01/server.112/e22490/ldr_field_list.htm#i1008234

    O carga paralela…
    Se agregó una nota en la que, y ampliado el comentario en SQL*Loader.

    OriginalEl autor David Aldridge

  4. 0

    Suponiendo MAX(ID) es en realidad lo suficientemente rápido, ¿no sería posible:

    • Primer lugar, obtener MAX(ID)+1
    • A continuación, obtener NEXTVAL
    • Comparar los dos y secuencia de incremento en el caso de NEXTVAL es más pequeño que el MAX(ID)+1
    • Uso NEXTVAL en la instrucción INSERT

    En ese caso me habría totalmente estable procedimiento y manual inserta también podrán sin tener que preocuparse acerca de la actualización de la secuencia

    Eres la introducción de las lagunas, que no es realmente un problema; y todavía tienes una ventana donde dos sesiones de consulta de la misma max(id) valor, a pesar de que la nextval llamadas debe hacer el trabajo. Esto no se puede hacer en formato SQL, sin embargo, y permitiendo una mezcla aún está desordenado. Otro enfoque similar es el intento de insertar con nextval en un bucle, salir de si no obtener una ORA-00001, suponiendo que hay un PK/reino unido en la columna. Que evita tener que buscar el máximo, y llena los vacíos, que puede o puede no ser deseable. Sólo el uso de la secuencia es más fácil, aunque…

    OriginalEl autor Stefanos Kargas

Dejar respuesta

Please enter your comment!
Please enter your name here