sql - 我怎样才能在 Postgres 9.5 中做一些更新插入

标签 sql postgresql upsert

我有一个简单的表格:

NAME    | TIMESTAMP | AMOUNT
--------------------------
Name1   | 123       | 1
Name2   | 123       | 15
Name3   | 124       | 3
Name4   | 125       | 1

等等。 现在我得到了一个新记录。如果名称和时间戳相等,我希望金额增加新记录的金额,否则应插入新记录。

类似于:

INSERT INTO test.data (NAME, TIMESTAMP, AMOUNT) values ('Name1', 123, 4) 
IF not EXIST; OTHERWISE UPDATE test.data set AMOUNT + NEWAMOUNT where TIMESTAMP = oldTimestamp and NAME = oldName

这是否可以通过使用 Postgres 9.5 的一个简单的 sql 查询以某种方式实现?

谢谢

最佳答案

使用新的 on conflict子句:

INSERT INTO test.data (NAME, TIMESTAMP, AMOUNT) 
values ('Name1', 123, 4) 
on conflict (name, timestamp) 
  do update 
    set AMOUNT + excluded.NEWAMOUNT 

这需要您在(name, timestamp)

上定义唯一约束(或索引)

如果您不想让 (name, timestamp) 唯一,您可以使用可写的 CTE:

with new_values (name, timestamp, amount) as (
  values ('Name1', 123, 4)
), changed as (
  update data 
     set amount = amount + t.amount
  from new_values nv 
   where data.name = nv.name
     and data.timestamp = nv.timestamp
  returning *
)
insert into data (name, timestamp, amount)
select name, timestamp, amount
from new_values
where not exists (select 1 from changed);

请注意(与on conflict 解决方案不同)这对于并发更新而言是不安全的,并且您可能会遇到竞争条件

关于sql - 我怎样才能在 Postgres 9.5 中做一些更新插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522886/

相关文章:

sql - PostgreSQL:删除从另一个表引用的行

sql - 分层查询

postgresql - Windows 10 上的 SonarQube 6.4 : Can't login

python - celery :事件==信号?

子查询中同一表的 MySQL UPDATE 和 SELECT

mysql - 如何根据另一列获取记录总和?

python - Django:将新外键添加到现有模型,默认值为同一模型中的另一个外键

mysql - 插入mysql数据库,如果记录已经存在,则更新

Node.js MongoDB Upsert 更新

python - 使用 SQLAlchemy 批量更新