在一个 SQL 语句中,我尝试插入一行,如果由于约束而失败,则返回现有行。
I have:
INSERT INTO session (token, expiry) SELECT 'abcdefg', '2014-05-14 20:25:12.279667' WHERE NOT EXISTS (SELECT * FROM session where token= 'abcdefg');
The 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);
查询首先生成一个CTEd与您要插入的数据
然后它产生 CTEt会话中的令牌与中的令牌相匹配d(如果不匹配则为空)。
然后它使用CTEi插入行来自d如果没有匹配项t into session.
最后它返回来自的行d如果它确实有匹配项t.
顺便说一句,这也适用于多行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)