Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

È possibile implementare un incremento manuale con il semplice SQL INSERT?

Capisci che avrai delle collisioni, vero?

devi fare qualcosa del genere e questo potrebbe causare deadlock, quindi assicurati di cosa stai cercando di ottenere qui

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

Per spiegare la cosa della collisione, ho fornito del codice

prima crea questa tabella e inserisci una riga

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

Ora apri due finestre di query ed eseguilo contemporaneamente

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

Ne vedrai un sacco

Server:Msg 2627, Livello 14, Stato 1, Riga 7 Violazione del vincolo PRIMARY KEY 'PK__Table1__3213E83F2962141D'. Impossibile inserire una chiave duplicata nell'oggetto 'dbo.Table1'. L'istruzione è stata terminata.