相关疑难解决方法(0)

在PostgreSQL中重复更新时插入?

几个月前,我从Stack Overflow的答案中学到了如何使用以下语法在MySQL中一次执行多个更新:

INSERT INTO table (id, field, field2) VALUES (1, A, X), (2, B, Y), (3, C, Z)
ON DUPLICATE KEY UPDATE field=VALUES(Col1), field2=VALUES(Col2);
Run Code Online (Sandbox Code Playgroud)

我现在切换到PostgreSQL,显然这是不正确的.它指的是所有正确的表,所以我认为这是使用不同关键字的问题,但我不确定PostgreSQL文档中的哪个被覆盖.

为了澄清,我想插入几个东西,如果它们已经存在则更新它们.

sql postgresql upsert sql-merge

611
推荐指数
15
解决办法
40万
查看次数

Postgres 9.5+:UPSERT返回更新和插入行的计数

我得到了一个典型的例子:

 INSERT INTO user_logins (username, logins)
 VALUES ('Naomi',1),('James',1)
 ON CONFLICT (username)
 DO UPDATE SET logins = user_logins.logins + EXCLUDED.logins;
Run Code Online (Sandbox Code Playgroud)

但现在我还需要知道:

  1. 插入了多少行
  2. 由于存在,已更新了多少行
  3. 由于约束,无法插入多少行
  4. 如果最后一行不遵守约束,先前插入/更新的行是否会保留在DB中?

postgresql upsert

13
推荐指数
1
解决办法
1496
查看次数

Postgres - ON CONFLICT - 如何知道是否发生UPDATE而不是INSERT

我有一张桌子

CREATE TABLE foo
(
    f0 int,
    time_stamp timestamp,
    CONSTRAINT foo_pk PRIMARY KEY (f0)
)
Run Code Online (Sandbox Code Playgroud)

我需要大量写入此表,因此性能是关键.有时,我会写一个具有现有值的记录,f0并且只会更新time_stamp到当前时间.为此,我使用了一个ON CONFLICT..DO UPDATE条款.

问题是我需要知道是否INSERT已经发生或是UPDATE.

我虽然使用第二is_update列.插入,插入false

`ON CONFLICT .. DO UPDATE set is_update=true`
Run Code Online (Sandbox Code Playgroud)

然后RETURNING is_update用来得到我想要的东西.问题在于引入了与数据本身无关的附加列.

sql postgresql upsert postgresql-9.5

12
推荐指数
2
解决办法
2106
查看次数

标签 统计

postgresql ×3

upsert ×3

sql ×2

postgresql-9.5 ×1

sql-merge ×1