sql >> Databasteknik >  >> RDS >> Sqlserver

upprätthålla en anpassad kolumn för automatisk ökning

Problemet är att om du har flera rader som infogas använder du samma nästa tillgängliga ID för alla rader, du måste lägga till ROW_NUMBER() in för att säkerställa att xid var unikt i infogningen:

insert into [xtable] (XID)
select [x].[NextavailableID] + ROW_NUMBER() OVER (ORDER BY i.ID)
from inserted [i]
cross apply
(
  select coalesce(max([t].[XID]), 0) [NextavailableID]
  from [xtable] [t] WITH (TABLOCK, HOLDLOCK)
) [x];

När det gäller att förhindra dubbletter kan du använda tabelltips för att låsa xtable när du får maximal xid .

Nackdelen med att använda dessa lås är att du kommer att få låsning. Du bör ha en unik begränsning/index på den här kolumnen eftersom detta kommer att förhindra dubbletter, men det kommer också att resultera i undantag när ett tävlingsvillkor är uppfyllt. I slutändan, vilken metod du än väljer kommer du att behöva göra någon form av uppoffring.



  1. PDO-bindningsvärden för MySQL IN-sats

  2. Vad händer om du inte begår en transaktion till en databas (säg SQL Server)?

  3. Vad betyder Trusted =ja/nej i SQL-anslutningssträngen?

  4. Postgres:\copy syntaxfel i .sql-filen