执行 SELECT 或 INSERT

2024-05-25

我想写一些类似的东西CASE以我想要的方式在 PostgreSQL 中声明SELECT从表中,如果什么也没找到,我想INSERT改为放入表中。

我的示例表allocated_ideas看起来像这样:

challenge_id | user_id    | idea_id        | round | is_completed
-------------+------------+----------------+-------+-------------
 '5d956daa'  | '9afbca19' | '3798826ae522' |   5   | false

我想在 SQL 函数中做这样的事情:

SELECT EXISTS (
SELECT 1 from allocated_ideas ai
where ai.user_id = '9afbca19' 
and ai.challenge_id = '5d956daa'
    and ai.is_completed is false

如果此条件为真,则返回idea_id。否则,将值插入表中。伪代码:

if (above query is true) {
    SELECT idea_id from allocated_ideas ai 
    where ai.user_id = '9afbca19' 
    and ai.challenge_id = '5d956daa'
        and ai.is_completed is false 
} else {
  INSERT VALUES INTO allocated_ideas('67879', '46578', '978798', 6, false)
}

无并发写入负载在桌子上,您可以简单地:

WITH sel AS (
   SELECT idea_id
   FROM   allocated_ideas
   WHERE  user_id = '9afbca19' 
   AND    challenge_id = '5d956daa'
   AND    is_completed IS false 
   )
, ins AS (
                             -- spell out target columns!
   INSERT INTO allocated_ideas (challenge_id, user_id, idea_id, round, is_completed)
   SELECT '67879', '46578', '978798', 6, false
   WHERE  NOT EXISTS (TABLE sel)               -- only when sel is empty!
   -- RETURNING idea_id                        -- unused
)
TABLE sel;

数据修改 CTEins始终执行完成,即使最终主命令中没有引用它。 (一个简单的SELECT如果没有被引用就不会被执行。)请参阅:

  • 如果父级未被任何其他子级引用,则删除父级 https://stackoverflow.com/questions/15809463/delete-parent-if-its-not-referenced-by-any-other-child/15810159#15810159

如果您省略目标列INSERT,它可以无声地(或大声地)破裂!

您没有指定返回新的idea_id来自INSERT。如果您需要它,您可能还希望能够区分案例。我添加了专栏op为了这个目的:

WITH sel AS (
   -- like above
, ins AS (
   -- like above
   RETURNING idea_id                        -- used now
   )
SELECT 'sel' AS op, * FROM sel
UNION ALL
SELECT 'ins' AS op, * FROM ins;

该查询只能返回一行,并且INSERT在任何情况下都会执行(如果sel找到一行),所以我们不需要LIMIT 1.

通常,可以有并发写入负载但是,您希望避免竞争条件。看:

  • 函数中的 SELECT 或 INSERT 是否容易出现竞争条件? https://stackoverflow.com/questions/15939902/is-select-or-insert-in-a-function-prone-to-race-conditions/15950324#15950324
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

执行 SELECT 或 INSERT 的相关文章

随机推荐

  • 使用php显示.txt文件的内容

    使用此代码 我可以显示文件夹中任何txt文件的内容 问题是 txt 文件中的所有格式等都被跳过 txt 文件看起来像 nipponsei irc rizon net presents Title Ah My Goddess Sorezore
  • 使用 toast 显示来自 catch 语句的错误消息

    我的 Android 应用程序中有以下 catch 语句 我想通过 toast 显示任何错误消息 我可以这样做吗 catch Exception e Helper displayExceptionMessage this e getMess
  • FFMPEG波形透明,背景纯色

    我正在尝试使用 ffmpeg 生成波形 我希望背景为纯色 实际波形为透明 以下部分实现了我想要的 除了有黑色背景 我希望能够将其更改为任何颜色 但波形是透明的 我怎样才能用 ffmepg 实现这个目标 ffmpeg i input mp3
  • Spring Security匿名用户可以访问每个url

    我正在开发 gwt 应用程序 我想使用 spring security 来保护它 我在数据库中有用户数据 UserService 负责获取特定用户 我已经关注了这个tutorial http www javacodegeeks com 20
  • 如何使用 --build 选项查看 cmake 发出的命令

    当我运行 cmake build target INSTALL 命令时 如何查看发出的命令 似乎没有像 versbose之类的选项 cmake 帮助说 cmake build 是底层构建工具的接口 但没有说明有关发出的命令转储的任何内容 我
  • 使用 PHP 读取 cookie

    我正在尝试读取我用 javascript 设置的 cookie 特别是 jQuery Cookie 插件 然后我用 PHP 读取它以将其写入数据库 由于某种原因 cookie 是在页面加载时创建的 但在页面刷新之前并不 存在 这意味着我正在
  • 在 Java 中使用 Scala 常量

    我目前正在评估 Scala 的未来项目 并发现了一些奇怪的事情 我在 JSP 中为我们创建了以下常量 val FORMATED TIME formatedTime 但这没有用 经过一番尝试后 我决定反编译以了解其真相 private fin
  • 未捕获的类型错误:对象 [object Object] 没有方法“自动完成”

    我不断收到错误 未捕获类型错误 对象 对象对象 没有方法 自动完成 它工作得很好 直到几天前我似乎找不到问题 似乎 jquery ui 正在加载 所以我不明白为什么该方法不起作用 My code
  • Google API 令牌端点 POST 返回错误请求 400

    我正在尝试用一次性 Google Plus 授权代码换取访问令牌 但我不断收到 400 Bad Request 我正在使用VB NET 这是代码 We should now have a good one time authorizatio
  • 从数据库中删除样式 (SQL Server)

    我正在处理旧的数据库表 其中有附加了 CSS 的值 例如 font size 4 Select your gender font font size 4 Select your country font 除了一次删除一个样式之外 还有什么方
  • 如何更改 Sublime Text 3 中缩进指南选项的颜色?

    如何更改缩进引导线颜色 您需要编辑您正在使用的配色方案的配色方案文件 并找到
  • 使用 dplyr 对 R 中所有因变量进行分组汇总统计

    我正在尝试为 10 个因变量中的每一个生成分组 听力 我的自变量 因此 HL 和 NH 是两个组 汇总统计数据 平均值 标准差 最小值 最大值 标准误差等 我可以使用以下 2 个代码对一个变量 R PTA 执行此操作 1 RightPTA
  • 如何使用 graph api 获取粉丝页面的点赞数?

    如何使用 graph api 获取粉丝页面的点赞数 早些时候它在这里 https graph facebook com FANPAGE ID access token ACCESS TOKEN https graph facebook co
  • SQL Server 中的 FOR XML 路径

    注意 我已经解决了这个问题的大部分 但遇到了障碍 请读到底部 您将看到我在哪里添加了 注意 部分 TIA I have a rather extensive join query that I want dumped to XML I ha
  • YouTube iframe 嵌入 - 全屏

    我有一个嵌入网页的表单 填写完表格后 将使用 iframe 嵌入显示 YouTube 视频 当我进入 YouTube 视频的全屏模式时 什么也没有发生 嵌套 iframe 的全屏是否受到父 iframe 尺寸的限制 在当前的 YouTube
  • 让浏览器缓存我的动态 PHP 样式表

    我想在 PHP 文件 styles php 中创建一个样式表 以便样式表变得动态 具体取决于请求的用户 对于每个单独的用户来说 样式表是不变的 因此应该缓存在他的客户端浏览器上 我读过 您可以通过设置内容类型和缓存控制等标头来实现此目的 但
  • C++11:atomic::compare_exchange_weak 是否支持非原始类型?

    我有以下代码 include
  • 平静的 POST 响应的“最佳”实践

    所以这里没有什么新内容 我只是想得到一些澄清 似乎在其他帖子中找不到任何澄清 我正在平静地创建一个新资源 说 books POST 与身体 title The Lion the Witch and the Wardrobe author C
  • AngularJs 路由提供者 404

    下面的代码来自 AngularJs 教程 我稍作修改 我希望从 url 中删除哈希值 我实际上成功了 但现在我有其他问题 当我使用链接本地主机时 它工作得很好并将我重定向到本地主机 电话 但万一我尝试直接链接 localhost phone
  • 执行 SELECT 或 INSERT

    我想写一些类似的东西CASE以我想要的方式在 PostgreSQL 中声明SELECT从表中 如果什么也没找到 我想INSERT改为放入表中 我的示例表allocated ideas看起来像这样 challenge id user id i