我正在尝试找到在应用程序上创建“赞”按钮的最佳方法。我想打相同的端点,并有一个存储过程照顾逻辑。到目前为止,这是我所拥有的,但似乎不起作用。我的目标是测试记录是否存在,如果确实存在,则删除记录,否则创建记录。请让我知道我在做什么错,或者如果存储过程是解决问题的方法。以下是该过程中我想要的逻辑,但目前无法正常工作。谢谢
IF (SELECT * FROM favorite_movies WHERE movie_id = '577922' and user_id = '5' limit 1)then
delete from favorite_movies WHERE movie_id = 577922 and user_id = 5;
else
INSERT INTO favorite_movies (user_id, movie_id)VALUES (5, 577922);
END IF
我得到的错误是
SQL Error [42601]: ERROR: syntax error at or near "IF"
Position: 1
答案 0 :(得分:0)
不需要plpgsql。 Postgres在common-table-expressions中支持returning
,这使得在单个查询中实现逻辑成为可能:
with
param (movie_id, user_id) as (select 577922, 5), -- query parameters
del as ( -- try to delete
delete from favorite_movies m
using param p
where m.movie_id = p.movie_id and m.user_id = p.user_id
returning 1
)
insert into favorite_movies (movie_id, user_id) -- if nothing was deleted, then insert
select p.*
from param p
where not exists (select 1 from del)
基本上,这实现了“切换”功能。第一次执行查询时,没有要删除的内容,因此会插入新行;下次,它将删除该行,因此不会插入,依此类推。