如果您无法预测有多少(最大)用户将与一项业务相关,则不能使用序列(即使可以,我也不建议以这种方式使用增量)。
如果您使用 Postgres >=9,您可以使用WITH来避免最大查询,方法是将计数器作为主表的列(或者创建一个包含一对 business_id(PK),next_id 的新表,如果您不能更改业务表)。
添加列 next_id:
ALTER TABLE Businesses ADD COLUMN next_id bigint;
//update current rows with default value
ALTER TABLE Businesses ALTER COLUMN next_id SET DEFAULT 0;
ALTER TABLE Businesses ALTER COLUMN next_id SET NOT NULL;
要插入用户,请使用以下单个 SQL 语句,该语句将返回新的 id 作为结果。
With X as (
Update Businesses
set next_id=next_id+1
where id=:param_business_id
Returning next_id)
Insert into Users (business_id,id,name)
Select :param_business_id, X.next_id ,:param_name
From X
Returning id
这会将第一个 id 插入为“1”,因为(第一个)返回子句返回更新后的值。或者,如果您使用保存 id 的单独表,只需将“更新业务”替换为“更新 MY_ID_TABLE”。请注意,此解决方案不是普通 SQL。