Autonuméricos: obtén el último insertado en Oracle, MySQL y SQL Server

Hola amigos!!! En la entrada de hoy vamos a trabajar con autonuméricos en Oracle, MySQL y SQL Server. Veremos como obtener el último valor de los campos IDENTITY (SQL SERVER), AUTO_INCREMENT (MySQL) e IDENTITY (ORACLE a partir de la versión 12c. Sequence en versiones anteriores).

Autonuméricos: cómo obtener el último insertado en Oracle, MySQL y SQL  Server | gpsos.es

Si tienes en mente realizar un select MAX (…) del campo a consultar… NO LO HAGAS! No es una buena idea. El problema es que si lo intentas en tu equipo de pruebas te funcionará bien, pero en la realidad no te servirá.

¿Por qué no es fiable obtener los autonuméricos con Select MAX ?

El motivo es que en entornos con muchos usuarios simultáneos, entre que tú introduces tu pedido en la tabla y haces la consulta para ver el ID máximo, otro usuario puede haber introducir otro pedido en la misma tabla que ya tendrá un ID más alto. Si simplemente averiguas el máximo corres el riesgo (casi seguro) de que tus líneas de pedido y tu cliente queden asociados a un pedido que no les corresponde. ¿Ves el problema?

Veamos pues como obtener los valores autonuméricos en Oracle, MySQL y SQL Server

SQL SERVER:

SELECT SCOPE_IDENTITY()

Devuelve el último valor de identidad insertado en una columna de identidad en el mismo ámbito. Un ámbito es un módulo: un procedimiento almacenado, desencadenador, función o lote. Por tanto, si dos instrucciones se encuentran en el mismo procedimiento almacenado, función o lote, están en el mismo ámbito.

MYSQL:

SELECT LAST_INSERT_ID()

En el caso de MySQL esta instrucción devuelve el último auto-numérico que se haya generado en la misma conexión que estemos usando actualmente. Mientras no compartamos conexiones (algo poco probable en cualquier caso) no tendríamos problema para obtenerlo con confianza.

ORACLE:

En el caso de Oracle, es un poco más complejo. Para empezar, y aunque parezca increíble, Oracle no tenía campos auto-incrementales hasta la aparición de su versión 12c en Junio de 2013. Antes de eso había que ingeniárselas usando Secuencias y disparadores para poder conseguir lo mismo.

 CREATE TABLE Pedidos (
     IDPedido INT PRIMARY KEY,
      ....
 ); 

Tenemos que crear también una secuencia del id de los pedidos

CREATE SEQUENCE SecuenciaPedidos
MINVALUE 1 MAXVALUE 1000 INCREMENT BY 1;

Y un trigger que dispare la secuencia.

CREATE OR REPLACE TRIGGER orders_bit
 BEFORE INSERT ON Pedidos
 FOR EACH ROW
 BEGIN
   SELECT SecuenciaPedidos.NEXTVAL
   INTO   :new. IDPedido
    FROM   dual;
 END;
 Como paso 

Como paso final, debíamos realizar un returning para insertar

 INSERT INTO Orders (CustomerID, EmployeeID, OrderDate....)
 VALUES (1, 1...)
 RETURNING OrderID INTO :last_insert_id 

En la version 12c lo han mejorado y la sentencia de creación del auto incrementable es :

 CREATE TABLE Orders
   (OrderID NUMBER GENERATED ALWAYS AS IDENTITY, ... ); 

Ahora, eso sí, para obtener el valor debemos hacer exactamente lo mismo que antes en la instrucción de inserción, es decir, usar RETURNING INTO para obtener el valor, como acabamos de ver. Más información en https://docs.oracle.com/en/database/other-databases/nosql-database/19.1/java-driver-table/creating-tables-identity-column.html

Esperamos que os haya sido de utilidad amigos! Nos vemos en la próxima, si necesitas ayuda con este u otro tema de base de datos, no dudes en contactar con nosotros.

Síguenos en nuestra página de LinkedIn para estar informado.

¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.