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

utrzymywanie niestandardowej kolumny automatycznego przyrostu

Problem polega na tym, że gdy wstawiasz wiele wierszy, używasz tego samego następnego dostępnego identyfikatora dla wszystkich wierszy, musisz dodać ROW_NUMBER() in aby upewnić się, że xid był unikalny we wstawce:

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

Jeśli chodzi o zapobieganie duplikatom, możesz użyć wskazówek tabeli, aby zablokować xtable przy pobieraniu maksymalnego xid .

Wadą korzystania z tych zamków jest to, że otrzymasz zakleszczenie. Powinieneś mieć unikalne ograniczenie/indeks w tej kolumnie, ponieważ zapobiegnie to duplikatom, ale spowoduje również wyjątki, gdy spełniony zostanie warunek wyścigu. Ostatecznie, niezależnie od wybranej metody, będziesz musiał dokonać pewnego rodzaju poświęcenia.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Domyślna data pobrania dla daty wstawienia

  2. Wystąpił błąd podczas odszyfrowywania Service Master Key podczas próby utworzenia katalogu SSIS

  3. Obsługa SQL 2008 HierarchyID w NHibernate

  4. 3 najważniejsze powody, dla których ludzie przechodzą na SaaS

  5. Podziel dane w ciągu SQL Server