Postgres:高并发写入加载DB中的SELECT或INSERT

时间:2018-03-27 21:30:45

标签: sql postgresql select upsert sql-returning

我们有一个DB,我们需要一个“selsert”(非upsert)函数。 该函数应采用文本值并返回现有行的id列(SELECT)或插入新行的值和返回ID(INSERT)。 有多个进程需要执行此功能(selsert)

我一直在尝试INSERT的pg_advisory_lockON 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)));

0 个答案:

没有答案