当前位置: 首页 > 面试题库 >

从条件INSERT获取ID

白嘉志
2023-03-14
问题内容

对于这样的表:

CREATE TABLE Users(
    id SERIAL PRIMARY KEY,
    name TEXT UNIQUE
);

什么是正确的一次查询插入以下操作:

给定用户name,插入新记录并返回新记录id。但是,如果name已经存在,则只需返回id

我知道PostgreSQL 9.5中针对的新语法ON CONFLICT(column) DO UPDATE/NOTHING,但是鉴于我需要id返回,因此我无法弄清楚它是否有帮助(如果有的话)。

似乎RETURNING idON CONFLICT不属于在一起。


问题答案:

UPSERT的实现非常复杂,以确保不会发生并发写访问。看一下这个Postgres
Wiki
,它在最初的开发过程中用作日志。Postgres黑客决定RETURNING在Postgres
9.5的第一个发行版的子句中不包括“排除”行。他们可能会为下一个版本构建一些内容。

这是手册中解释您的情况的重要说明:

RETURNING列表的语法与的输出列表的语法相同SELECT仅返回成功插入或更新的行。 例如,如果某行被锁定但由于ON CONFLICT DO UPDATE ... WHERE不满足子句条件而未更新,则不会返回该行。

大胆强调我的。

对于要插入的 单行

在同一表上没有并发写入负载

WITH ins AS (
   INSERT INTO users(name)
   VALUES ('new_usr_name')         -- input value
   ON     CONFLICT(name) DO NOTHING
   RETURNING users.id
   )
SELECT id FROM ins
UNION  ALL
SELECT id FROM users          -- 2nd SELECT never executed if INSERT successful
WHERE  name = 'new_usr_name'  -- input value a 2nd time
LIMIT  1;

在表上可能存在并发写入负载

考虑一下(对于 单行 INSERT

要插入一 组行

  • 如何在从INSERT …发生冲突时将排除的行包括在内

所有这三个都有非常详细的说明。



 类似资料:
  • 第一次插入将插入一个具有增量id的新行。我需要获取该增量id并在使用该增量id,例如,如果它是,我将进行以下插入。 如何自动获取第一次插入的id,以便在第一次查询后动态生成第二次插入?

  • 我有以下数据帧: 我希望获得行ID,其中。 预期收益为。 有什么想法吗?

  • 有没有办法从GZIPInputStream获取条目?对于zip文件我正在使用以下文件: 但我想用排除文件中的条目。xml。gz扩展。或者是否有办法提取内部数据。xml。gz文件是否为字符串?

  • 问题内容: 我有一个不时更新数据集的数据库。在这里,可能发生的是交付了数据库中已经存在的数据集。 目前,我首先要做的是 检查是否已经存在具有这些数据的数据集(使用WHERE语句中的数据)。如果没有返回任何值,则说明我正在执行INSERT。 但这对我来说似乎有点复杂。所以我的问题是:是否有某种条件式INSERT仅在不存在新数据集的情况下才添加它? 我正在使用 SmallSQL 问题答案: 您几乎可以

  • 问题内容: 我正在使用mysql并遇到一些问题。我想检索插入的最后一行。 <<以下是详细>> 以下是我创建表格的方式。 我在其中插入了四个值,如下所示 当我执行时,我得到如下输出 当我尝试下面的代码时, 我得到如下输出。 但是,当我使用代码时,出现错误 使用时,表中没有任何数据。 链接以播放数据 注意: 这里我使用4只是为了获得所需的输出。稍后我可以从查询中获取 如果我只想查看最后一条记录,请建议

  • 问题内容: 我有酒店实体: 现在,我需要计算给定城市的酒店数量。可以通过以下方式完成: 但这是非常 肮脏的 方式。似乎有了标准会更好,但是我不知道如何实现它。 问题答案: 域对象上有动态计数器和查找器: 当然,在用户指南中有更多详细信息