我在PostgreSQL 9.5中有以下发现:

INSERT INTO chats ("user", "contact", "name") 
           VALUES ($1, $2, $3), 
                  ($2, $1, NULL) 
ON CONFLICT("user", "contact") DO NOTHING
RETURNING id;

如果没有冲突,它会返回如下内容:

----------
    | id |
----------
  1 | 50 |
----------
  2 | 51 |
----------

但如果存在冲突,则不会返回任何行:

----------
    | id |
----------

I want to return the new id columns if there are no conflicts or return the existing id columns of the conflicting columns.
Can this be done? If so, how?

推荐答案

我遇到了完全相同的问题,我用"做更新"而不是"什么都不做"来解决它,尽管我没有什么要更新的.在你的情况下,会是这样的:

INSERT INTO chats ("user", "contact", "name") 
       VALUES ($1, $2, $3), 
              ($2, $1, NULL) 
ON CONFLICT("user", "contact") 
DO UPDATE SET 
    name=EXCLUDED.name 
RETURNING id;

此查询将返回所有行,无论它们是否刚刚插入或之前存在.

Sql相关问答推荐

我如何计算字母a出现的字符串的次数?

Postgres:对包含数字的字符串列表进行排序

当一个视图在Postgres中失效时?

PostgreSQL基于2个COLS的任意组合 Select 唯一行

SQL子查询返回多个值错误

如何隐藏聚合JSON数组元素的键

在一个子查询中签入ID';S,如果未返回,则签入另一个子查询

在MS Access Modern图表的X轴上显示时间值时遇到问题

按用户和时间列出的SQL Group考勤列表

用VB.NET在Dapper中实现MS Access数据库顺序透视

基于开始/结束日期重叠的BigQuery突发行

将用户授予另一个用户不授予权限

如何使用SQL生成数据的滚动3天总和

按行值出现的顺序对行值进行分组

使用ALTER TABLE无法删除列

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

面对来自以下两个代码的不同输出

使用一组值进行分组和计数

显示 30 天内未购买的客户

判断每组的条件,并对最近的行进行排名?