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

vedligeholde en tilpasset automatisk stigningskolonne

Problemet er, at hvor du har flere rækker ved at blive indsat, bruger du det samme næste tilgængelige ID for alle rækker, du skal tilføje ROW_NUMBER() ind for at sikre, at xid'et var unikt i indsættelsen:

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];

Med hensyn til at forhindre dubletter kan du bruge tabeltip til at låse xtable når du får den maksimale xid .

Ulempen ved at bruge disse låse er, at du vil få deadlocking. Du bør have en unik begrænsning/indeks på denne kolonne, da dette vil forhindre dubletter, men det vil også resultere i undtagelser, når en race-betingelse er opfyldt. I sidste ende, uanset hvilken metode du vælger, bliver du nødt til at give en form for ofre.



  1. Returner alle fremmednøgler &CHECK-begrænsninger i en SQL Server-database (T-SQL-eksempler)

  2. Indsæt data fra en tabel i en anden i MySQL

  3. Fatal fejl:Ufanget fejl:Kald til udefineret funktion sql_regcase

  4. Oracle 11g Reports and Forms Properties Masseopdateringer