PostgreSQL:更新...缺少插入?

Posted

技术标签:

【中文标题】PostgreSQL:更新...缺少插入?【英文标题】:PostgreSQL: UPDATE ... ON MISSING INSERT? 【发布时间】:2016-06-27 14:37:31 【问题描述】:

PostgreSQL 具有“INSERT ... ON CONFLICT UPDATE”构造,但在我的查询中,大多数情况下我需要更新。

所以我不希望数据库尝试插入然后才更新,我希望它会尝试UPDATE,如果记录不存在 - 将INSERT

有可能吗? 它会提高性能吗?

【问题讨论】:

您希望从中获得什么? 我预计性能会提高,因为我会尝试第一次更新,这在我的情况下更有可能成功 你可以做UPDATE,如果行数为零,那么INSERT.. ON CONFLICT UPDATE。将方法与您的实际数据进行比较,以检查它是否更快。 我需要在一个语句中做到这一点,可以吗? 【参考方案1】:

它会提高性能,而且还取决于您将拥有哪些代码。如果你构建一个表,然后使用一个单独的函数来检查它是否有你想要添加的数据,然后做相应的事情(如果存在-插入否则没有)。在这种情况下,您的代码会占用部分内存。这种方法在处理海量数据时很好,可以节省一小部分内存

【讨论】:

我可以用一条 SQL 语句,没有函数吗? 是的,当然。您可以在插入 where 语句时执行此操作。试试这个例子:【参考方案2】:
INSERT INTO hundred(name, name_slug, status) 
SELECT DISTINCT name, name_slug, status 
FROM hundred 
WHERE NOT EXISTS ( 
 SELECT 'X' 
 FROM temp_data 
 WHERE temp_data.name = hundred.name AND temp_data.name_slug = hundred.name_slug  AND temp_data.status = status );

为了简化,“where”语句是做你想做的事的关键:

   INSERT INTO table (id, field, field2)
   SELECT 3, 'C', 'Z'
   WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3);

【讨论】:

这就是你的意思,@Pavel Bernshtam 对不起,我没有看到在你的例子中我在哪里做更新?我想先尝试更新表 UPDATE table (id, field, field2) SET id= 3, field= 'C', field2='Z' WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3); 我的意思是,你可以使用 'WHERE' stat-t 来完成剩下的工作。 我明白了,但我如何在单个语句中执行“更新如果不成功则插入”?

以上是关于PostgreSQL:更新...缺少插入?的主要内容,如果未能解决你的问题,请参考以下文章

在 Postgresql 的时间序列数据中添加缺少的每月日期

插入后PostgreSQL触发函数更新

如何在 PostgreSQL 中进行 UPSERT(合并、插入……重复更新)?

如何使用 JOOQ 在 PostgreSQL 中插入带有 JSON 列的可更新记录?

2017.9.15 postgresql批量插入造成冲突后执行更新

PostgreSQL - 我有啥办法可以定义一个在插入或更新时将空字符串转换为 null 的列?