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

Muligt at implementere en manuel stigning med blot simpel SQL INSERT?

Du forstår godt, at du vil have kollisioner?

du er nødt til at gøre sådan noget, og dette kan forårsage dødvande, så vær meget sikker på, hvad du forsøger at opnå her

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

For at forklare kollisionstingen har jeg givet noget kode

opret først denne tabel og indsæt en række

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

Åbn nu to forespørgselsvinduer og kør dette på samme tid

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 vil se en masse af disse

Server:Besked 2627, niveau 14, tilstand 1, linje 7 Overtrædelse af PRIMÆR NØGLE-begrænsning 'PK__Tabel1__3213E83F2962141D'. Kan ikke indsætte dubletnøgle i objektet 'dbo.Table1'. Sætningen er blevet afsluttet.



  1. Begræns SQL-forespørgsel til kun de to øverste tæller pr. gruppe

  2. Fejlfinding af SQL Server-transaktionelle replikeringsproblemer

  3. Hvordan finder jeg, hvad der fylder en tabel?

  4. strftime i sqlite konverter til postgres