tur*_*nip 5 postgresql bulkinsert upsert
我将提供我的问题的简化示例。
我有两个表:reviews和users。
reviews更新了一系列用户发布的评论。获取评论的过程还返回提交评论的用户的信息(某些用户数据经常更改)。
我想在users每次reviews使用批量更新时进行更新COPY。users当获取的数据包含来自同一用户的两个或多个评论时,就会出现此问题。如果我做的很简单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
account_age_in_mins。这是实现我的目标的正确方法吗?
这是一个非常好的做法。当您仅锁定临时表中的元组时,也许您可以避免表锁。 https://dba.stackexchange.com/questions/106121/locking-in-postgres-for-update-insert-combination
| 归档时间: |
|
| 查看次数: |
1879 次 |
| 最近记录: |