Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Möglich, ein manuelles Inkrement mit nur einfachem SQL INSERT zu implementieren?

Du verstehst, dass es Kollisionen geben wird, richtig?

Sie müssen so etwas tun, und dies kann zu Deadlocks führen. Seien Sie sich also sehr sicher, was Sie hier erreichen möchten

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

Um die Kollisionssache zu erklären, habe ich etwas Code bereitgestellt

erstelle zuerst diese Tabelle und füge eine Zeile ein

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

Öffnen Sie nun zwei Abfragefenster und führen Sie diese gleichzeitig aus

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

Sie werden eine Reihe davon sehen

Server:Nachricht 2627, Ebene 14, Status 1, Zeile 7, Verletzung der PRIMARY KEY-Einschränkung „PK__Table1__3213E83F2962141D“. Doppelter Schlüssel kann nicht in Objekt „dbo.Table1“ eingefügt werden. Die Anweisung wurde beendet.