微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个简单的表在Postgresql有三列:

> id serial主键
> key varchar
> value varchar

我已经看到这个问题在这里SO: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”子句或类似的东西,我可以在那里?

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

返回行(如果已存在)

with s as (
    select id,"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,"value"
)
select id,"value"
from i
union all
select id,"value"
from s

如果该行不存在,它将返回一个已存在的行。

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

原文地址:https://www.jb51.cc/postgresql/193470.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐