Postgresql 在Postgres中使用DELETE的返回值进行更新

Postgresql 在Postgres中使用DELETE的返回值进行更新,postgresql,syntax,sql-update,sql-delete,Postgresql,Syntax,Sql Update,Sql Delete,我需要使用从另一个表中删除的值更新一个表。这种情况是一个评论投票记分员类似的一个如此。我正在使用python来处理postgres,但这不会有什么区别 query=""" UPDATE comment SET score=score-(DELETE FROM history WHERE commentId=%(commentId)s AND userIden

我需要使用从另一个表中删除的值更新一个表。这种情况是一个评论投票记分员类似的一个如此。我正在使用python来处理postgres,但这不会有什么区别

query="""
UPDATE comment SET score=score-(DELETE FROM history
                                WHERE commentId=%(commentId)s AND
                                      userIdentity=%(userIdentity)s RETURNING vote)
WHERE commentId=%(commentId)s;
"""
cursor.execute(query, data)
错误发生在从中删除时;出现语法错误。我可以用SELECT语句替换DELETE语句,它会工作的,我在这里缺少什么吗?我想在更新中使用返回值。这可能吗?什么都行

相关模式:

CREATE TABLE history (
    commentId bigint,
    vote int,
    userIdentity varchar(256),
);
CREATE TABLE comment (
    id bigint,
    score bigint,
);

history.vote通常为1或-1。

PostgreSQL不允许将混合更新和删除语句作为子查询

您可以使用稍微不同的策略—可更新的CTE

postgres=# WITH t1 AS (DELETE FROM foo RETURNING *), t2 AS (INSERT INTO deleted SELECT * FROM t1 RETURNING *) SELECT max(a) FROM t2; 所以


注意:它需要9.1或更高版本

这将按预期工作,删除历史记录中的投票并自动更新投票分数。谢谢哇,你能用一句话做这么多事情真是太神奇了。 postgres=# CREATE TABLE comment(id int, score int); CREATE TABLE postgres=# CREATE TABLE history(id int, comment_id int, vote int); CREATE TABLE postgres=# INSERT INTO comment values(1,10); INSERT 0 1 postgres=# INSERT INTO comment values(2,20); INSERT 0 1 postgres=# INSERT INTO history values(1,1,5); INSERT 0 1 postgres=# WITH t1 AS (DELETE FROM history WHERE id=1 RETURNING comment_id, vote) UPDATE comment SET score=score-t1.vote FROM t1 WHERE t1.comment_id=comment.id; UPDATE 1 postgres=# select * from comment; id | score ----+------- 2 | 20 1 | 5 (2 rows)