如果不存在则插入,否则返回 postgresql 中的 id

2024-01-10

我在 PostgreSQL 中有一个简单的表,包含三列:

  • id 序列主键
  • 键变量
  • 值 varchar

我已经在这里看到了这个问题:在 PostgreSQL 中重复更新时插入? https://stackoverflow.com/questions/1109061/insert-on-duplicate-update-postgresql但我想知道如何获取 id(如果存在),而不是更新。如果标准做法总是“插入”或“如果存在则更新”,为什么呢?执行 SELECT (LIMIT 1) 的成本是否大于执行 UPDATE 的成本?

我有以下代码

INSERT INTO tag
    ("key", "value")
    SELECT 'key1', 'value1'
WHERE
    NOT EXISTS (
        SELECT id,"key","value" FROM tag WHERE key = 'key1' AND value = 'value1'
    );

它的工作原理是,如果存在,它不会插入,但我想获取 id。是否有一个“RETURNING id”子句或类似的东西我可以在那里点击?


就在这里returning

INSERT INTO tag ("key", "value")
SELECT 'key1', 'value1'
WHERE NOT EXISTS (
    SELECT id, "key", "value"
    FROM node_tag
    WHERE key = 'key1' AND value = 'value1'
    )
returning id, "key", "value"

如果该行已存在则返回该行

with s as (
    select id, "key", "value"
    from tag
    where key = 'key1' and value = 'value1'
), i as (
    insert into tag ("key", "value")
    select 'key1', 'value1'
    where not exists (select 1 from s)
    returning id, "key", "value"
)
select id, "key", "value"
from i
union all
select id, "key", "value"
from s

如果该行不存在,它将返回插入的行,否则返回现有的行。

顺便说一句,如果“键”/“值”对使其唯一,那么它就是主键,并且不需要 id 列。除非“键”/“值”对中的一个或两个可以为空。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果不存在则插入,否则返回 postgresql 中的 id 的相关文章

随机推荐