Postgres upsert在冲突中使用-冲突条件下的多个字段

问题描述 投票:0回答:1

我正在尝试在postgres数据库中实现喜欢/不喜欢项的概念-当用户喜欢/不喜欢某项时,我想在我的数据库中插入一个项来表示这一点。

这是我的模式:

id | postID | userID | type 
 1      2        1      like 

现在,如果用户已经喜欢该项目,现在他们决定不喜欢它-我想将type字段从like更新为dislike

类似地,如果他们不喜欢某些东西,现在决定喜欢它,我想执行相反的更新。

此外,用户只能喜欢/不喜欢某件事-因此,如果该用户以前喜欢/不喜欢该帖子,现在又决定再次喜欢/不喜欢它,则什么也不会发生。

这意味着我需要在postgres中实现upsert语句,如果用户之前未与该帖子进行交互,则该语句将插入新行,如果具有指定type的行,则将更新postID + userID + type字段已经存在。

我当时正在使用on conflict语法-

INSERT INTO table_name(postID,userID,type) 
VALUES(2,1,'like') 
ON CONFLICT (????) DO UPDATE 
  SET type = 'like'

但是我不确定要传递给ON CONFLICT部分,因为匹配需要在多个字段上进行。

我考虑过在(postID,userID)字段上设置唯一索引-像这样:

create unique index idx_1 on table (postID, userID)

问题是我将来想使用此数据库来存储评论信息,并且允许用户多次对同一帖子发表评论。

一个例子是:

id | postID | userID | type 
 1      2       1      comment
 2      2       1      comment 
 3      2       1      like 
sql postgresql sql-update sql-insert upsert
1个回答
0
投票

您需要在postiduserid上创建唯一索引

create unique index on table_name (postid, userid);

然后您可以在ON CONFLICT子句中使用这些列:

INSERT INTO table_name(postID,userID,type) 
VALUES (2,1,'like') 
ON CONFLICT (postid, userid) 
DO UPDATE  
  SET type = 'like'
© www.soinside.com 2019 - 2024. All rights reserved.