给定这样的表格:https ://dbfiddle.uk/Z8hOhnYG
CREATE TABLE accounts (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
);
CREATE TABLE profiles (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY
);
CREATE TABLE account_profiles (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
account_id bigint NOT NULL REFERENCES accounts,
profile_id bigint NOT NULL REFERENCES profiles
);
要求是:
- 每个帐户必须始终至少有一个与之关联的个人资料。
- 因此,新帐户必须始终创建新配置文件并将其关系行添加到数据库
- 当整个操作因任何原因失败时,什么都不会创建。
所以为了批处理的目的,我想把它写成一个多插入查询,所以我想出了这个算法:
- 创建一系列长度与账户数相同的ID
- 添加帐户
- 加入该系列的新帐户
- 添加配置文件
- 加入该系列的新个人资料
- 在其系列 ID 上加入帐户和个人资料系列表并将结果插入到关系表中
- 返回新帐户
你将不得不做
insert
-returning
或使用lastval()
经过一番讨论,我们得出了这个结论:
在这里,我使用窗口函数
row_bnumber() over ()
为每个新插入的行分配行号,给出一个可以在最终结果集中加入的数字。