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 中进行 UPSERT(合并、插入……重复更新)?
如何使用 JOOQ 在 PostgreSQL 中插入带有 JSON 列的可更新记录?