sql >> Database >  >> RDS >> Sqlserver

een aangepaste kolom voor automatisch ophogen onderhouden

Het probleem is dat wanneer u meerdere rijen invoegt, u dezelfde volgende beschikbare ID voor alle rijen gebruikt, u moet ROW_NUMBER() toevoegen in om er zeker van te zijn dat de xid uniek was in de insert:

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

Met betrekking tot het voorkomen van duplicaten kunt u tabelhints gebruiken om xtable te vergrendelen bij het verkrijgen van de maximale xid .

Het nadeel van het gebruik van deze sloten is dat je vastloopt. U zou een unieke beperking/index voor deze kolom moeten hebben, omdat dit duplicaten zal voorkomen, maar het zal ook leiden tot uitzonderingen wanneer aan een race-voorwaarde wordt voldaan. Welke methode je ook kiest, je zult uiteindelijk een offer moeten brengen.



  1. Jooq LocalDateTime-velden gebruiken systeemtijdzone in plaats van sessietijdzone

  2. Wilt u gegevens ophalen uit de database op basis van selectie in de vervolgkeuzelijst met behulp van php

  3. Kan postgresql.service niet starten?

  4. PostgreSQL 11 - Procedures