sql >> Databasteknik >  >> RDS >> Sqlserver

Möjligt att implementera en manuell ökning med bara enkel SQL INSERT?

Du förstår att du kommer att få kollisioner eller hur?

du måste göra något liknande och detta kan orsaka dödlägen så var väldigt säker på vad du försöker åstadkomma här

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

För att förklara kollisionen har jag tillhandahållit lite kod

skapa först den här tabellen och infoga en rad

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

Öppna nu två frågefönster och kör detta samtidigt

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

Du kommer att se ett gäng av dessa

Server:Msg 2627, Nivå 14, Tillstånd 1, Rad 7 Brott mot PRIMÄRNYCKEL-begränsningen 'PK__Table1__3213E83F2962141D'. Det går inte att infoga dubblettnyckel i objektet 'dbo.Table1'. Uttrycket har avslutats.



  1. Hur funktionen EXPORT_SET() fungerar i MySQL

  2. PostgreSQL vs Oracle:kompileringstidskontroll av PL/pgSQL

  3. Välja en kolumn från en tabell i MySQL två gånger

  4. IIF(...) inte en känd inbyggd funktion