这是在Postgres中批量在冲突中插入INSERT的正确方法吗?

tur*_*nip 5 postgresql bulkinsert upsert

我将提供我的问题的简化示例。

我有两个表:reviewsusers

reviews更新了一系列用户发布的评论。获取评论的过程还返回提交评论的用户的信息(某些用户数据经常更改)。

我想在users每次reviews使用批量更新时进行更新COPYusers当获取的数据包含来自同一用户的两个或多个评论时,就会出现此问题。如果我做的很简单INSERT ON CONFLICT,我可能会遇到错误,因为and INSERT语句无法两次更新同一行。

A SELECT DISTINCT可以解决该问题,但是我也想保证将最新数据插入users表中。这就是我的做法。请记住,我正在批量执行此操作:

1.创建一个临时表,以便我们可以COPY往返它。

CREATE TEMPORARY TABLE users_temp (
    id uuid, 
    stat_1 integer, 
    stat_2 integer, 
    account_age_in_mins integer);
Run Code Online (Sandbox Code Playgroud)

2. COPY数据放入临时表

COPY users_temp (
    id,
    stat_1,
    stat_2,
    account_age_in_mins) FROM STDIN CSV ENCODING 'utf-8';
Run Code Online (Sandbox Code Playgroud)

3.锁定users表并执行INSERT ON CONFLICT

LOCK TABLE users in EXCLUSIVE MODE;

INSERT INTO users SELECT DISTINCT ON (1) 
    users_temp.id,
    users_temp.stat_1,
    users_temp.stat_2,
    users_temp.account_age_in_mins
FROM users_temp
ORDER BY 1, 4 DESC, 2, 3
ON CONFLICT (id) DO UPDATE
SET
    stat_1 = EXCLUDED.stat_1,
    stat_2 = EXCLUDED.stat_2,
    account_age_in_mins = EXCLUDED.account_age_in_mins';
Run Code Online (Sandbox Code Playgroud)

我在步骤3)中执行a SELECT DISTINCT和an 的原因是因为我:ORDER BY

  1. 只想返回重复行的一个实例。
  2. 通过对这些重复项进行排序,可以确保我得到最新记录account_age_in_mins

这是实现我的目标的正确方法吗?