Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Czy można zaimplementować ręczną inkrementację za pomocą prostej instrukcji SQL INSERT?

Rozumiesz, że będziesz mieć kolizje, prawda?

musisz zrobić coś takiego, a to może spowodować zakleszczenie, więc bądź bardzo pewien, co próbujesz tutaj osiągnąć

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

Aby wyjaśnić sprawę kolizji, udostępniłem trochę kodu

najpierw utwórz tę tabelę i wstaw jeden wiersz

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

Teraz otwórz dwa okna zapytań i uruchom je jednocześnie

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

Zobaczysz kilka z nich

Serwer:komunikat 2627, poziom 14, stan 1, wiersz 7 Naruszenie ograniczenia klucza podstawowego „PK__Table1__3213E83F2962141D”. Nie można wstawić zduplikowanego klucza w obiekcie „dbo.Table1”. Instrukcja została zakończona.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy można uzyskać adres mac za pomocą procedury składowanej?

  2. Używanie zmiennych asc i desc w kolejności według

  3. Wybierz ostatnie 30 dni z zapytaniem sql

  4. Zmiana sortowania SQL Server na bez uwzględniania wielkości liter z rozróżniania wielkości liter?

  5. Tworzenie dynamicznych boksów (divów) z różnymi tytułami zwracanymi przez SP