当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL冲突更新时插入(upsert)使用所有排除的值

郑锦
2023-03-14

当您正在向上插入一行时(PostgreSQL)

INSERT INTO tablename (id, username, password, level, email) 
                VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') 
ON CONFLICT (id) DO UPDATE SET 
  id=EXCLUDED.id, username=EXCLUDED.username,
  password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email

还有更短的路吗?也就是说:使用所有排除值。

在SQLite中,我曾经做过:

INSERT OR REPLACE INTO tablename (id, user, password, level, email) 
                        VALUES (1, 'John', 'qwerty', 5, 'john@mail.com')

共有1个答案

逑何平
2023-03-14

Postgres还没有实现与INSERT OR REPLACE等价的功能。

它可以是DO NOTH,也可以是DO UPDATE子句,指定发生冲突时要执行的UPDATE操作的确切细节。

虽然它没有给您替换的简写,但ON CONFLICT DO UPDATE更普遍地适用,因为它允许您根据先前存在的数据设置新值。例如:

INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;
 类似资料:
  • 我有一张像下面这样的桌子。我试图根据CTE中的值合并到此表中。但当我试图在出现冲突时更新表时,它无法获得CTE中的值 现在使用cte,我想在这个表中插入/更新记录。下面是我用来做同样的事情的代码。当记录已经存在于表中时,我想根据cte(cte_input_data.data_type_id)中的data_type_id值更新表,但它失败并出错。 它应该实现的是 > 如果cte_输入_数据。数据类型

  • 我正在写一个数据挖掘程序,可以批量插入用户数据。 当前SQL只是一个普通的批量插入: 如果发生冲突,如何进行更新?我试过: 但它抛出

  • 我有一个表,它有,,和 在常规插入时自动递增。 的值介于1到10之间,因为有10个问题,但对表来说不是唯一的,并且依赖于列。 用于引用单独表中的报表。 我要实现的是,如果对于特定的没有冲突的,则插入新的记录。如果有冲突,则用新的

  • 和都属于类型或任何其他数字数据类型。是我的PK。 现在,我希望在表中执行更新查询,如果该行不存在,我希望插入该行。如果用户已经存在,我希望将点数增加1,否则插入用户ID,点数默认为1。 我知道我可以这样做: 但是,在我的情况下,更新操作比插入新行更频繁。假设每天有5000个查询,其中大约4500行是对现有行的操作。做相反的upsert将是更有利的,因为冲突将减少到500次,而不是4500次。我想先

  • 我有一张这样定义的桌子 我如何定义排除约束,以便只有一行具有特定

  • 我想更新表中几行的主键。如果所有行都已更新,则键将再次是唯一的,但第一行的更新会导致与第二行的键发生临时冲突。有没有优雅的方法来解决这个问题? 例子: 错误:重复的键值违反了唯一约束“pk_erichtest”