我正在尝试在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
您需要在postid
和userid
上创建唯一索引
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'