ここで私の答えを見てください: sql server: generate primary key based on counter and another column value
あなたの目的のために、次のように会社のテーブルを定義できます。
create table dbo.company
(
id int not null primary key ,
name varchar(32) not null unique ,
order_counter not null default(0) ,
...
)
したがって、注文テーブルは次のとおりです。
create table dbo.order
(
company_id int not null foreign key references dbo.company( id ) ,
id int not null ,
order_number as 100000*company_id + id ,
...
constraint order_AK01 unique nonclustere ( order_number ) ,
constraint order_PK01 primary key clustered ( company_id , id ) ,
)
そして、「注文を追加」クエリを次のように設定します。
declare @new_order_number int
update dbo.company
set @new_order_number = dbo.company.order_counter + 1 ,
order_counter = dbo.company.order_counter + 1
where dbo.company.id = @some_company_id
insert dbo.order ( company_id , id ) value ( @some_company_id , @new_order_number )
同時実行(競合)条件はありません。「連動更新」がそれを処理します。さらに、データベース設計を非正規化していません (最初の正規形では、すべての行と列の交差がアトミック/非分解可能である必要があります。適用可能なドメインからの値が 1 つだけ含まれ、他には何も含まれていません。あなたのような複合識別子は禁止されています。)
簡単!