此问题在此处已有答案:
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语句。
1条答案
按热度按时间k5hmc34c1#
字符串
查询首先使用要插入的数据生成CTE(公共表表达式)d
然后,它使用会话中的令牌生成CTEt,该令牌与d中的令牌匹配(如果不匹配,则为空)。
然后,如果t中没有匹配项,则使用CTEi将d中的行插入到session中。
最后,它返回来自d的行,如果它在t中有匹配的话。
顺便说一句,这也适用于多行。