看看我的答案在這裏: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)
您沒有併發(競賽)條件:「互鎖更新」負責處理此問題。此外,您還沒有對數據庫設計進行非規範化處理(第一種常規形式要求每行和每一列交叉點都是原子 /不可分解的:它只包含來自適用域的一個值,而不包含其他值。 )
簡單!
你使用的是什麼rdbms? sql-server,mysql,oracle?你爲什麼要讓訂單號碼依賴於companyid? – Taryn
我從變量名中假設他正在使用SQL Server ...重新標記。 –
正確SQL Server – bbrian51