Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Possible d'implémenter une incrémentation manuelle avec un simple SQL INSERT ?

Vous comprenez que vous aurez des collisions, n'est-ce pas ?

vous devez faire quelque chose comme ça et cela pourrait provoquer des blocages, alors soyez très sûr de ce que vous essayez d'accomplir ici

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

Pour expliquer la collision, j'ai fourni du code

créez d'abord ce tableau et insérez une ligne

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

Ouvrez maintenant deux fenêtres de requête et exécutez-les en même temps

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

Vous en verrez un tas

Serveur :Msg 2627, Niveau 14, État 1, Ligne 7Violation de la contrainte PRIMARY KEY 'PK__Table1__3213E83F2962141D'. Impossible d'insérer la clé en double dans l'objet 'dbo.Table1'. L'instruction a été terminée.