Cómo insertar registros en nuestras tablas sin saltos

by | Sep 8, 2021 | Sin categoría | 0 comments

En este tutorial paso a paso te muestro como podes hacer insert en tus tablas cuando necesitas que los números (por ejemplo un ID) deban ser secuenciales y además evitar saltos en sus datos.

Código utilizado en el video

/*
NUMERAR REGISTROS SIN DUPLICADOS Y SALTOS
*/

-- EJEMPLO 1 (USO DE IDENTITY)
USE master 
GO

DROP DATABASE IF EXISTS  DEMO_NUMERADOR
GO

CREATE DATABASE DEMO_NUMERADOR
GO

USE DEMO_NUMERADOR
GO

CREATE TABLE TEST1 (ID INT IDENTITY(1,1) PRIMARY KEY,
                    C1 INT,
					C2 DATE)

-- INSERT OK

INSERT INTO TEST1 (C1,C2)
VALUES (1,GETDATE())

SELECT * FROM TEST1

-- INSERT NO OK

INSERT INTO TEST1 (C1,C2)
VALUES ('H',GETDATE())

-- INSERT OK

INSERT INTO TEST1 (C1,C2)
VALUES (2,GETDATE())

SELECT * FROM TEST1


DROP TABLE TEST1 

------------------------------------------
---- EJEMPLO 2 CON TABLA -----------------
------------------------------------------
DROP TABLE IF EXISTS NUMERADOR
CREATE TABLE NUMERADOR (TABLA VARCHAR(255),
                        ULTIMO_NUMERO INT)

INSERT INTO NUMERADOR VALUES ('TEST1',0)

CREATE TABLE TEST1 (ID INT  PRIMARY KEY,
                    C1 INT,
					C2 DATE)


-- PROCESO CON UPDATE 

DECLARE @NRO INT

BEGIN TRAN
 UPDATE NUMERADOR SET
 @NRO = ULTIMO_NUMERO = ULTIMO_NUMERO+1 
 WHERE  TABLA = 'TEST1'

 INSERT INTO TEST1 (ID,C1,C2)
 VALUES (@NRO,1,GETDATE())

COMMIT TRAN
GO 3

SELECT * FROM NUMERADOR
SELECT * FROM TEST1 

-- HACEMOS FALLAR
DECLARE @NRO INT
BEGIN TRAN
 UPDATE NUMERADOR SET
 @NRO = ULTIMO_NUMERO = ULTIMO_NUMERO+1 
 WHERE  TABLA = 'TEST1'

 INSERT INTO TEST1 (ID,C1,C2)
 VALUES (@NRO,'H',GETDATE())

COMMIT TRAN

-- VOLVEMOS A INSERTAR UNO NUEVO

DECLARE @NRO INT

BEGIN TRAN
 UPDATE NUMERADOR SET
 @NRO = ULTIMO_NUMERO = ULTIMO_NUMERO+1 
 WHERE  TABLA = 'TEST1'

 INSERT INTO TEST1 (ID,C1,C2)
 VALUES (@NRO,1,GETDATE())

COMMIT TRAN


SELECT * FROM NUMERADOR
SELECT * FROM TEST1 

--- PROBAMOS CONCURRENCIA (SESION 1)

DECLARE @NRO INT

BEGIN TRAN
 UPDATE NUMERADOR SET
 @NRO = ULTIMO_NUMERO = ULTIMO_NUMERO+1 
 WHERE  TABLA = 'TEST1'

 INSERT INTO TEST1 (ID,C1,C2)
 VALUES (@NRO,1,GETDATE())
 -- ROLLBACK TRAN
 -- COMMIT TRAN

--- PROBAMOS CONCURRENCIA (SESION 2)
USE DEMO_NUMERADOR 
GO

DECLARE @NRO INT

BEGIN TRAN
 UPDATE NUMERADOR SET
 @NRO = ULTIMO_NUMERO = ULTIMO_NUMERO+1 
 WHERE  TABLA = 'TEST1'

 INSERT INTO TEST1 (ID,C1,C2)
 VALUES (@NRO,1,GETDATE())

COMMIT TRAN

-- VEMOS VALORES

SELECT * FROM TEST1 
SELECT * FROM NUMERADOR 

Acerca del autor

Maximiliano Accotto

Experto en SQL Server y BI

Con mas de 20 años de experiencia y trayectoria trabajando con bases de datos SQL Server y BI.

Fui Microsoft MVP desde el 2005 al 2019 y soy orador frecuente para distintos eventos de Microsoft y comunidades técnicas.

Me especializado en temas de tuning, administracion, performance, diseño y BI en el mundo Microsoft ya sea para ambientes locales como nube.