sql >> Base de Datos >  >> RDS >> Sqlserver

¿Es posible implementar un incremento manual con solo SQL INSERT?

Entiendes que tendrás colisiones, ¿verdad?

necesita hacer algo como esto y esto podría causar interbloqueos, así que asegúrese de lo que está tratando de lograr aquí

DECLARE @id int
BEGIN TRAN

    SELECT @id = MAX(id) + 1 FROM Table1 WITH (UPDLOCK, HOLDLOCK)
    INSERT INTO Table1(id, data_field)
    VALUES (@id ,'[blob of data]')
COMMIT TRAN

Para explicar lo de la colisión, he proporcionado un código

primero cree esta tabla e inserte una fila

CREATE TABLE Table1(id int primary key not null, data_field char(100))
GO
Insert Table1 values(1,'[blob of data]')
Go

Ahora abra dos ventanas de consulta y ejecute esto al mismo tiempo

declare @i int
set @i =1
while @i < 10000
begin
BEGIN TRAN

INSERT INTO Table1(id, data_field)
SELECT MAX(id) + 1, '[blob of data]' FROM Table1

COMMIT TRAN;
set @i [email protected] + 1
end

Verás un montón de estos

Servidor:Mensaje 2627, Nivel 14, Estado 1, Línea 7 Violación de la restricción PRIMARY KEY 'PK__Table1__3213E83F2962141D'. No se puede insertar una clave duplicada en el objeto 'dbo.Table1'. La instrucción ha finalizado.