postgres:使用来自其他连接 table 的多条记录将行插入到 table
postgress: insert rows to table with multiple records from other join tables
我正在尝试将从联接 table 获得的多条记录插入另一个 table user_to_property。在 user_to_property table user_to_property_id 中是主要的,不是 null 它不是自动增量。所以我试图以 1 为增量手动添加 user_to_property_id。
WITH selectedData AS
( -- selection of the data that needs to be inserted
SELECT t2.user_id as userId
FROM property_lines t1
INNER JOIN user t2 ON t1.account_id = t2.account_id
)
INSERT INTO user_to_property (user_to_property_id, user_id, property_id, created_date)
VALUES ((SELECT MAX( user_to_property_id )+1 FROM user_to_property),(SELECT
selectedData.userId
FROM selectedData),3,now());
above gives me:ERROR: more than one row returned by a subquery used as an expression
如何从其他 table 的连接中向 table 插入多条记录? user_to_property table 包含同一用户 ID 的唯一记录,property_id 应该只有 1 条记录。
通常对于插入,您可以使用 values
或 select
。结构 values( select...)
经常(通常?)只会造成比其价值更多的麻烦,而且从来没有必要。您始终可以 select 常量或表达式。在这种情况下,转换为 select。要生成您的 ID,请从您的 table 中获取最大值,然后只需添加您要插入的 row_number:(参见 demo)
insert into user_to_property(user_to_property_id
, user_id
, property_id
, created
)
with start_with(current_max_id) as
( select max(user_to_property_id) from user_to_property )
select current_max_id + id_incr, user_id, 3, now()
from (
select t2.user_id, row_number() over() id_incr
from property_lines t1
join users t2 on t1.account_id = t2.account_id
) js
join start_with on true;
几个注意事项:
- 请勿将
user
用于 table 名称或任何其他对象名称。它是一个
Postgres 和 SQL 标准记录的保留字(并且有
自 Postgres v7.1 和 SQL 92 标准以来一直如此。
- 您确实应该创建另一列或更改列类型
user_to_property_id
自动生成。使用 Max()+1,或
任何基于这个想法的东西,都是你将产生的虚拟保证
重复键。很多用户和开发人员的乐趣。
当 2 个用户 运行 同时查询时,MVCC 会发生什么。
我正在尝试将从联接 table 获得的多条记录插入另一个 table user_to_property。在 user_to_property table user_to_property_id 中是主要的,不是 null 它不是自动增量。所以我试图以 1 为增量手动添加 user_to_property_id。
WITH selectedData AS
( -- selection of the data that needs to be inserted
SELECT t2.user_id as userId
FROM property_lines t1
INNER JOIN user t2 ON t1.account_id = t2.account_id
)
INSERT INTO user_to_property (user_to_property_id, user_id, property_id, created_date)
VALUES ((SELECT MAX( user_to_property_id )+1 FROM user_to_property),(SELECT
selectedData.userId
FROM selectedData),3,now());
above gives me:ERROR: more than one row returned by a subquery used as an expression
如何从其他 table 的连接中向 table 插入多条记录? user_to_property table 包含同一用户 ID 的唯一记录,property_id 应该只有 1 条记录。
通常对于插入,您可以使用 values
或 select
。结构 values( select...)
经常(通常?)只会造成比其价值更多的麻烦,而且从来没有必要。您始终可以 select 常量或表达式。在这种情况下,转换为 select。要生成您的 ID,请从您的 table 中获取最大值,然后只需添加您要插入的 row_number:(参见 demo)
insert into user_to_property(user_to_property_id
, user_id
, property_id
, created
)
with start_with(current_max_id) as
( select max(user_to_property_id) from user_to_property )
select current_max_id + id_incr, user_id, 3, now()
from (
select t2.user_id, row_number() over() id_incr
from property_lines t1
join users t2 on t1.account_id = t2.account_id
) js
join start_with on true;
几个注意事项:
- 请勿将
user
用于 table 名称或任何其他对象名称。它是一个 Postgres 和 SQL 标准记录的保留字(并且有 自 Postgres v7.1 和 SQL 92 标准以来一直如此。 - 您确实应该创建另一列或更改列类型
user_to_property_id
自动生成。使用 Max()+1,或 任何基于这个想法的东西,都是你将产生的虚拟保证 重复键。很多用户和开发人员的乐趣。 当 2 个用户 运行 同时查询时,MVCC 会发生什么。