postgresql Postgres:如果不存在则插入,否则返回行[重复]

mfuanj7w  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(79)

此问题在此处已有答案

Insert if not exists, else return id in postgresql(3个答案)
9年前关闭。
在一个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语句。

k5hmc34c

k5hmc34c1#

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
然后,它使用会话中的令牌生成CTEt,该令牌与d中的令牌匹配(如果不匹配,则为空)。
然后,如果t中没有匹配项,则使用CTEid中的行插入到session中。
最后,它返回来自d的行,如果它在t中有匹配的话。
顺便说一句,这也适用于多行。

相关问题