sql >> Base de Datos >  >> RDS >> Oracle

Oracle:diferencia entre max(id)+1 y secuencia.nextval

Con select max(id) + 1 enfoque, dos sesiones que se insertan simultáneamente verán el mismo ID máximo actual de la tabla, y ambas insertarán el mismo nuevo valor de ID. La única forma de usar esto de manera segura es bloquear la tabla antes de iniciar la transacción, lo cual es doloroso y serializa las transacciones. (Y como señala Stijn, los valores se pueden reutilizar si se elimina el registro más alto). Básicamente, nunca use este enfoque. (Muy ocasionalmente puede haber una razón de peso para hacerlo, pero no estoy seguro de haber visto una).

La secuencia garantiza que las dos sesiones obtendrán valores diferentes y no se necesita serialización. Funcionará mejor y será más seguro, más fácil de codificar y más fácil de mantener.

La única forma en que puede obtener errores duplicados usando la secuencia es si ya existen registros en la tabla con ID por encima del valor de la secuencia, o si algo todavía está insertando registros sin usar la secuencia. Entonces, si tenía una tabla existente con ID ingresados ​​manualmente, digamos 1 a 10, y creó una secuencia con un valor de inicio predeterminado de 1, la primera inserción que usa la secuencia intentaría insertar una ID de 1, que ya existe . Después de intentar eso 10 veces, la secuencia te daría 11, lo que funcionaría. Si luego usó el enfoque de ID máximo para hacer la siguiente inserción que usaría 12, pero la secuencia aún estaría en 11 y también le daría 12 la próxima vez que llame a nextval .

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

Si está cambiando de un enfoque manual a un enfoque de secuencia, debe asegurarse de que la secuencia se cree con un valor inicial que sea más alto que todos los ID existentes en la tabla, y que todo lo que hace una inserción use la secuencia. solo en el futuro.