我们有一个DB,我们需要一个“selsert”(非upsert)函数。 该函数应采用文本值并返回现有行的id列(SELECT)或插入新行的值和返回ID(INSERT)。 有多个进程需要执行此功能(selsert)
我一直在尝试INSERT的pg_advisory_lock
和ON CONFLICT
条款,但我仍然不确定哪种方法最有效(即使查看了一些other个答案)。
到目前为止,我已经提出了以下
WITH
selected AS (
SELECT id FROM test.body_parts WHERE (lower(trim(part))) = lower(trim('finger')) LIMIT 1
),
inserted AS (
INSERT INTO test.body_parts (part)
SELECT trim('finger')
WHERE NOT EXISTS ( SELECT * FROM selected )
-- ON CONFLICT (lower(trim(part))) DO NOTHING -- not sure if this is needed
RETURNING id
)
SELECT id, 'inserted' FROM inserted
UNION
SELECT id, 'selected' FROM selected
BTW,我可以通过创建唯一索引来确保(部分)没有重复值。这不是问题。我所追求的是SELECT返回现有值,如果另一个进程INSERT(我希望我正在解释这个)
唯一索引将具有以下定义
CREATE UNIQUE INDEX body_parts_part_ux
ON test.body_parts
USING btree
(lower(trim(part)));