当您正在向上插入一行时(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')
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”