暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译] CUD操作一次性返回行

原创 多米爸比 2023-02-11
471

原文标题:RETURNING Modified Rows
原文地址:https://sqlfordevs.com/returning-modified-rows
原文作者:Tobias Petry
翻译:多米爸比

在数据行处理的工作流程中,对于插入(Create)、修改(Update)、删除(Delete)及获取数据可优化多个SQL语句合并为一个,一次性返回。

背景

从数据库获取数据行,然后在内存中进行运算处理计算新值、再通过电子邮件发送或其他类似处理任务的多数实现并不高效。最终这些数据行在数据库中更新有时通过高效的批量更新,有时逐行更新。但数据库必须进行双倍的工作,一方面通过select查询获取数据行,修改数据行时仍会再次查找。

当我们使用PostgreSQL数据库时,RETURNING关键字的功能可以改变数据操作的行为。我们修改操作不仅可接收受影响的行数,还可获得数据行各列的值。更准确地说,RETURNING语法与SELECT语法获取指定列或列转换等功能类似。我们获得的值是数据操作执行触发后的新值。基于这个令人兴奋的功能,我们可以将之前工作流程简化为单个语句,该语句将执行数据更改并返回我们更改后的行。

对于插入语句获取数据

INSERT INTO tasks (
  status, owner, name
) VALUES (
  'open', 'tpetry', 'Create Example'
)
RETURNING *;

定睛一看,上面的插入语句返回查询结果似乎违反直觉。但当数据表有自动生成的主键、生成的列或修改插入值的触发器时,该功能就很方便。我们可以插入新数据,并在一次会话连接中取回值。

当我们使用INSERT … SELECT可以组合为一个更强大的工具,此时可以直接在数据库中执行许多操作无需在应用程序中多次传输数据行。

对于修改语句获取数据

UPDATE tasks
SET owner = NULL
WHERE owner = 'tpetry' AND status = 'open'
RETURNING *;

当我们更新完数据行后还需要继续处理这些数据行时,可以使用RETURNING更改工作流程返:在所有数据行更新完成后让PostgreSQL返回它们,然后我们可以继续对返回的数据进行处理。由于一次操作中我们查询和更新数据行,数据库效率将有所提高。不过需要注意,只有在执行所有更新后,我们才能获得数据值。如果我们需要语句更新之前的值,此方法将不起作用。

对于删除语句获取数据

DELETE FROM tasks
WHERE status = 'finished'
RETURNING *;

大多数应用程序都允许用户请求删除数据记录,但系统也需要对删除记录进行一些跟踪处理。与UPDATE操作一样,我们可以将DELETE和UPDATE操作合并为一个步骤。但是不会受UPDATE操作的限制,我们可以准确获取删除操作语句之前的数据记录。

保持联系

本人组建了一个粉丝群:PG乐知乐享交流群。欢迎关注文章的小伙伴随缘加入,进群请加微信并备注PG乐知乐享。

456.png

最后修改时间:2023-02-11 11:28:45
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论