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 条记录。

通常对于插入,您可以使用 valuesselect。结构 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; 

几个注意事项:

  1. 请勿将 user 用于 table 名称或任何其他对象名称。它是一个 Postgres 和 SQL 标准记录的保留字(并且有 自 Postgres v7.1 和 SQL 92 标准以来一直如此。
  2. 您确实应该创建另一列或更改列类型 user_to_property_id 自动生成。使用 Max()+1,或 任何基于这个想法的东西,都是你将产生的虚拟保证 重复键。很多用户和开发人员的乐趣。 当 2 个用户 运行 同时查询时,MVCC 会发生什么。