小编Der*_*ler的帖子

如何在 upsert 中获取冲突行的 ID?

我有一个tag包含 2 列的表:id(uuid) 和name(text)。我现在想在表中插入一个新标签,但如果该标签已经存在,我只想获取id现有记录的 。

我以为我可以ON CONFLICT DO NOTHING结合使用RETURNING "id"

INSERT INTO
    "tag" ("name")
VALUES( 'foo' )
ON CONFLICT DO NOTHING
RETURNING "id";
Run Code Online (Sandbox Code Playgroud)

但是,如果名称为“foo”的标签已经存在,则会返回一个空的结果集。

然后我将查询更改为使用 noopDO UPDATE子句:

INSERT INTO
    "tag" ("name")
VALUES( 'foo' )
ON CONFLICT ("name") DO UPDATE SET "name" = 'foo'
RETURNING "id";
Run Code Online (Sandbox Code Playgroud)

这按预期工作,但有点令人困惑,因为我只是将名称设置为已经存在的值。

这是解决这个问题的方法还是我缺少更简单的方法?

postgresql upsert postgresql-9.5

22
推荐指数
1
解决办法
1万
查看次数

标签 统计

postgresql ×1

postgresql-9.5 ×1

upsert ×1