在 Postgres 中使用 DELETE 的返回值进行 UPDATE

2024-02-03

我需要使用从另一个表中删除的值来更新表。情况是类似于SO 上的评论投票记分员。我正在使用 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)

错误出现在(DELETE FROM;出现语法错误。我可以更换DELETE声明与SELECT声明并且它会起作用,我在这里缺少什么吗?我想在更新中使用返回值。这可能吗?任何事情都有帮助。

相关架构:

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

历史投票通常是1 or -1.


PostgreSQL 不允许将 UPDATE 和 DELETE 语句混合作为子查询。

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



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

so



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)
  

注意:需要9.1或更高版本

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Postgres 中使用 DELETE 的返回值进行 UPDATE 的相关文章

  • 在 C++ 中,为什么我们不能使用 > 和 < 来比较迭代器? [复制]

    这个问题在这里已经有答案了 我被问过这个问题 我真的不知道为什么 如果你有指针int x 您可以将指针与 gt and lt 因为它代表内存位置 例如0x0000 0x0004 0x0008等等 我知道迭代器和指针是不同的 但它们的行为方式
  • 有没有办法使用 Hibernate/JPQL 查询 PostgreSQL hstore?

    假设我有一个如下所示的 Hibernate JPA 实体 Entity public class FooEntity Type type hstore HashMap
  • 如何在 JSON Postgres 数据类型列中搜索特定字符串?

    我有一个名为params在名为的表中reports其中包含 JSON 我需要找到 JSON 数组中任何位置包含文本 authVar 的行 我不知道文本可能出现的路径或级别 我只想使用标准的 like 运算符搜索 JSON 就像是 SELEC
  • 如何使用SpringBoot + JPA存储PostgreSQL jsonb?

    我正在开发一个迁移软件 该软件将消耗来自 REST 服务的未知数据 我已经考虑过使用 MongoDB 但我决定不使用它而使用 PostgreSQL 读完后this https blog codeship com unleash the po
  • Flask-SQLAlchemy 多态关联

    我有两个主表role and users 以及关于users我让 3 个关联到表operator teacher and student 到目前为止 我是这样做的 class Role db Model tablename roles id
  • 如何从 postgresql 获取 TEXT 列值

    我在 postgreSQL 中有一个以下简单的表 CREATE TABLE data id bigint NOT NULL text column text 正如我在 phpPgAdmin 网站中看到的那样 text column 的值是数
  • Laravel 5.3 Schema::create ENUM 字段是 VARCHAR

    我刚刚创建了新的迁移 运行后我看到了我的领域type 不是 ENUM 类型 它有一个改为 VARCHAR 255 类型 Schema create payments function Blueprint table table gt inc
  • 如何在 PostgreSql 的预订表中找到第一个空闲时间

    预订表包含预订开始日期 开始时间和持续时间 工作日的开始时间为工作时间 8 00 18 00 以半小时为增量 持续时间也以每天半小时为增量 CREATE TABLE reservation startdate date not null s
  • CREATE VIEW 指定的列名多于列

    如果我在 PostgreSQL 9 4 8 中运行以下语句 我会收到以下错误消息 CREATE VIEW 指定的列名多于列 但为什么 没有f1返回一个包含 5 列的表格 不应该v1也有 5 列吗 另外 如果我从第一个中删除演员阵容SELEC
  • 你能在 Python 语法中添加新的语句吗?

    您可以添加新的语句 例如print raise with 到 Python 的语法 说 允许 mystatement Something Or new if True print example 没那么多 如果你should 而是如果可能的
  • Python 中的“at”(@) 符号有什么作用?

    什么是 符号在Python中做什么 An 符号位于开始一条线用于类和函数装饰者 https docs python org 3 glossary html term decorator PEP 318 装饰器 http www python
  • 与 PostgreSQL CTE 的一般并行性

    我正在处理一些大数据 并且在查询中获取并行计划是必要的 我也很喜欢使用 CTE 来表达我的查询 但根据 PostgreSQL 的文档 我不太确定 CTE 是否对并行性造成严重限制 Here https www postgresql org
  • 如果未找到值,则使用默认值填充行 PostgresQL

    我想返回过去 7 天的 user activity 但对于那些空的日子我想添加 0 作为值 假设我有这张桌子 actions id date 67 123 2019 07 7 90 123 2019 07 9 100 123 2019 07
  • Postgres 简单的“数据透视表”

    如果我有一个这样的数据表 name type count test blue 6 test2 red 3 test red 4 我怎样才能查询它以获得一个表 name num red num blue test 4 6 test2 3 0
  • PostgreSQL C 函数建议

    有人可以给我一个关于自定义函数的初步尝试的提示吗 我需要用 2 个参数构造查询 一个 varchar 和一个 unix 时间戳 一个整数 我花了 3 个小时才得到下面的几行结果 查询测试可以是 select from pdc posot c
  • 通过 JDBC 将“daterange”字段值插入 PostgreSQL 表

    我在 PostgreSQL 9 3 有一个表日期范围 http www postgresql org docs 9 3 static rangetypes html字段类型 我可以像使用 JDBC 的字符串一样选择此字段 但无法将其插入表中
  • PostgreSQL 函数/存储过程 CURRENT_TIMESTAMP 不变

    我想跟踪函数内的执行时间 作为示例 我有以下状态跟踪表 CREATE TABLE status table run id numeric NOT NULL start ts timestamp 6 without time zone NOT
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • PostgreSQL 性能 - SELECT 与存储函数

    我正在尝试在 PostgreSQL 上创建一个存储函数来提高性能并存储大查询 并且只需在我的代码中调用该函数即可 例如 如果我有一个函数 CREATE OR REPLACE FUNCTION test max integer RETURNS
  • 数据库错误:值对于类型字符变化来说太长(100)

    我有一个 Django 网站 运行我们几年前在内部构建的迷你 CMS 它使用 postgresql 保存简单的标题和一段文本时 出现以下错误 value too long for type character varying 100 奇怪的

随机推荐

  • MSEdge 无法启动:崩溃(chrome 无法访问)

    我是 Selenium python 的初学者 我尝试使用以下代码使用现有配置文件 默认 调用 Edge 浏览器 但一旦执行开始 它就会抛出以下异常 有人可以帮我解决这个问题吗 我错过了什么吗 edge options webdriver
  • 当鼠标位于旋钮图像上时,如何将图像放在 jslider 的旋钮图像上

    当鼠标位于旋钮图像上时 我需要将图像放在 jslider 的旋钮图像上 我做过这样的事情 slider new Slider s new mySliderUI slider slider png slider setUI s slider
  • 在 Puppet 中迭代哈希键/值

    我正在尝试使用 Puppet 来更新 ASP NET web config 中的任意应用程序设置列表 用于部署目的 但我陷入了困境 主要是因为我是一个真正的 puppet 专家 我有这个 yaml 文件 hiera appSettings
  • “复数或单数生成的对象名称”设置是什么意思?

    设置新的实体数据模型时 可以选择 x 将生成的对象名称复数或单数化 我注意到这也是 LINQ 中的一个选项 另外 现在我正在研究 ADO NET 实体框架 我注意到它还有 DEFAULT 来 复数或单数生成的对象名称 设置 实体数据模型 时
  • Android Studio 中按 Enter 键换行?

    我刚刚开始使用 Android Studio 当我编辑 activity main xml 时 我无法通过按 Enter 键转到新行 另外 我尝试插入新字母 但新字母刚刚被替换 所以我到处点击以使输入键起作用 然后突然我得到了新的一行 我不
  • 如何使用MinGW Windres编译资源文件?

    我的最终目标是设置使用 MinGW gcc g 编译的可执行文件的版本 在属性 gt 详细信息中显示 但现在我想用 Windres 编译一个资源文件 以便稍后能够手动链接它 但是当我使用此命令时出现以下错误 windres resource
  • 通过批处理文件(.bat)编译 Inno Setup 项目

    在我的工作项目中 我们必须使用 Inno Setup 创建 4 个安装程序 这样 我必须逐个文件运行 这最终会占用我更多的时间 文件 iss setup prog 01 iss setup prog 02 iss setup prog 03
  • 解析 HTTParty 响应

    我正在使用 HTTParty 提取 Facebook 用户的书籍列表 但在解析响应时遇到问题 Facebook 以这种方式返回数据 data name Title category Book id 21192118877902 create
  • Mac上像Cloud App一样自动截图上传

    云应用程序 http getcloudapp com 有这个巧妙的功能 当新的屏幕截图添加到桌面时 它会自动上传它们 有什么想法如何做到这一点吗 您可以自己做类似的事情 而无需太多编程方式 在操作系统中 您可以配置 文件夹操作 http w
  • Android自定义视图组委托addView

    我想实现自定义ViewGroup就我而言 源自FrameLayout但我希望从 xml 添加的所有子视图不直接添加到此视图中 而是添加到FrameLayout包含在这个习俗中ViewGroup 让我举个例子来说明这一点
  • 缺少必需的模块 Firebase - Jenkins 构建错误

    我已经配置了 jenkins 来构建我的 ios swift 应用程序 我用过 xcode 版本 8 1 和 swift 版本 3 我是 Jenkins 的新手 并继续集成过程 根据我的控制台输出 我认为构建成功 因为控制台输出像这样打印
  • java.lang.UnsupportedOperationException:AdapterView 中不支持 addView(View, LayoutParams)

    我正在使用网上找到的 Expandable ListView 示例 活动 public class ExpandableListViewActivity extends ExpandableListActivity strings for
  • utf8mb4_unicode_ci 与 utf8mb4_bin

    首先让我们看看我是否做对了 字符集是一组符号和编码 排序规则是用于比较字符集中字符的一组规则 我应该使用 utf8mb4 因为 mysql utf8 是一种欺诈 最多 3 字节 而不是 PHP 中真正的最多 4 字节真正的 utf8 字符集
  • 打字稿和传播运算符?

    function foo x number y number z number console log x y z var args number 0 1 2 foo args 为什么我在 Typescript Playground 中收到
  • 多个 Activemq 远程代理的 Spring 配置

    如何在spring上下文中配置多个远程activemq代理 不同的IP地址 以下是 1 个远程代理的配置 我正在使用camel来创建路由 用于在多个远程代理中的不同队列中生成和使用消息 根据以下路由 系统如何知道每个队列属于哪个远程代理 项
  • 没有为命名空间 / 和操作名称 hello 映射的操作

    package com tutorialspoint struts2 public class HelloWorldAction private String name public String execute throws Except
  • 如何在asp.net core 1.0中获取当前的url

    在以前版本的 ASP NET 中 我们可以使用 Request Url AbsoluteUri 但似乎已经改变了 我们如何在 ASP NET Core 1 0 中做到这一点 您必须分别获取主机和路径 Context Request Host
  • 画一棵二叉树

    我正在寻找一个js库 它允许用户绘制二叉树 添加 删除叶子 添加 删除父节点等 我发现了很多库 但其中大多数仅用于数据可视化 例如 d3 而不是从浏览器中绘制 这真的存在吗 Thanks 看看现有的绘制图表的东西 树就是图 纯 JavaSc
  • 使用 jQuery 将具有相对路径的外部 HTML 页面加载到 DIV 中

    我对 jQuery 比较陌生 如果这个问题太简单 请原谅 但我已经搜索了许多线程几个小时 但找不到明确的解决方案 我有以下文件夹结构 index html html pages page1 html html pages images ht
  • 在 Postgres 中使用 DELETE 的返回值进行 UPDATE

    我需要使用从另一个表中删除的值来更新表 情况是类似于SO 上的评论投票记分员 我正在使用 python 来处理 postgres 但这应该没有什么区别 query UPDATE comment SET score score DELETE