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

Postgres:如果不存在则插入,否则返回行

赫连心思
2023-03-14
问题内容

在一个SQL语句中,我尝试插入一行,如果由于约束而失败,则返回现有行。

我有:

INSERT INTO session (token, expiry) SELECT 'abcdefg', '2014-05-14 20:25:12.279667' WHERE  NOT EXISTS (SELECT * FROM session where token= 'abcdefg');

token列具有唯一约束。我尝试RETURNING *在末尾追加,但这仍然不返回现有行。

为什么是这样?我以为我的最后一条SELECT语句将被执行并返回。有任何想法吗?

注意:由于某些复杂的竞争条件,我无法使用Postgres函数或多个SQL语句。


问题答案:

WITH d(t, e) AS ( VALUES (‘abcdefg’, ‘2014-05-14 20:25:12.279667’)),
t AS (SELECT token FROM session, d WHERE token=t),
i AS (INSERT INTO session (token, expiry)
SELECT t, e FROM d WHERE t NOT IN (SELECT token FROM t))
SELECT t,e FROM d WHERE t IN (SELECT token FROM t);


查询首先使用您要插入的数据进行CTE d

然后,它使用会话中的令牌与 d* 中的令牌匹配(如果没有匹配,则为空)来创建CTE t*

然后,如果它在 t中* 没有匹配项,则使用CTE id中 的行插入到 session中 ***

最后,如果在 t中* 有匹配项,则从 d 返回行。 *

顺便说一句,这也适用于多行。



 类似资料:
  • 问题内容: 我在node.js中编写一个函数来查询PostgreSQL表。 如果该行存在,我想从该行返回id列。 如果不存在,我想将其插入并返回ID()。 我一直在尝试和语句的变体,但似乎无法使其正常工作。 问题答案: 我建议在数据库端进行检查,然后将ID返回给nodejs。 例子: 而不是在Node.js端(在此示例中,我使用的是node-postgres):

  • 问题内容: 我有一个带有2个表的数据库,如下所示: 列是,并且是 和 在申请表中,我有2个编辑框,名称分别为和 如果用户像电子邮件一样插入一个新的负责人姓名, 那么在保存表格的过程中,我想将新的负责人姓名插入表中,请插入最后一个并将其更新为。 如果用户保持名称,但它更新电子邮件一样,然后我想在从1 =使用新的电子邮件地址和他们(其余和)保持不变。 如果负责人的名称相同,我想保留from表的原始引用

  • 问题内容: 我在使用SQL查询时遇到问题。如果同一行尚不存在,我需要插入一行。这是我到目前为止的内容: 我对sql不太熟悉,尤其是不存在的语法,因此在执行时会出现以下错误: ORA-06550:第37行,第11列:PLS-00103:在预期以下情况之一时遇到了符号“ INSERT”: 然后和或 用“ then”符号代替“ INSERT”继续。 following: the following: 问

  • 我有一个带有< code>ID主键(自动增量)和唯一列< code>Name的表。如果相同的< code>Name不存在,在MariaDB中有没有一种有效的方法将一行插入到这个表中,否则选择现有的行,并且在这两种情况下,返回具有这个< code>Name的行的ID? 这是Postgres的解决方案。然而,MariaDB似乎没有子句。到目前为止,我尝试的是暴力: 更新:MariaDB 10.5有子句

  • 问题内容: 如果存在,它就可以工作,但是如果不存在,我想将此数据作为新行插入。 更新 datenum是唯一的,但这不是主键 问题答案: Jai是正确的,您应该使用。 请注意,由于它是唯一键,因此不需要在update子句中包含datenum,因此它不应更改。您确实需要包括表中的所有其他列。您可以使用该函数来确保在更新其他列时使用正确的值。 这是使用适用于MySQL 的正确语法重写的更新:

  • 问题内容: 如果给定的文件名已经在数据库中,我想在表中进行更新,否则我想插入新行。我尝试此代码,但显示的错误请给我正确的方式,因为我在SQL中更新鲜 问题答案: 你应该 在查询中使用 参数 - 总是! - 没有例外 创建一个处理 服务器上零件的单个查询 __ 使用公认的ADO.NET最佳实践将事物放入块等。 试试下面的代码: