sql - 如何在 postgres INSERT ON CONFLICT DO UPDATE 中返回列的旧值?

标签 sql postgresql

我正在尝试在 postgres 中运行“更新插入”,例如:

INSERT INTO my_table (
    id, -- unique key
    name,
    hash
) VALUES (
    '4b544dea-b355-463c-8fba-40c36ac7cb0c',
    'example',
    '0x0123456789'
) ON CONFLICT (
    id
) DO UPDATE SET
    name = 'example',
    hash = '0x0123456789'
RETURNING
    OLD.hash;

我想返回 hash 列的先前值(由于 OLD 不是有效的表别名,上面的示例不是有效查询)。重要的是,我正在尝试找到一种不会在负载下引起冲突的方法来执行此操作。这可能吗?或者是在事务中执行先读后写的唯一解决方案?

最佳答案

如果您愿意更新架构,另一个可能的答案是将之前的值存储在另一列中:

ALTER table my_table add column prev_hash text;

INSERT INTO my_table (
    id, -- unique key
    hash
) VALUES (
    1,
    'a'
) ON CONFLICT (
    id
) DO UPDATE SET
    hash = excluded.hash,
    prev_hash = my_table.hash
RETURNING
    id,
    hash,      -- will be the new hash
    prev_hash  -- will be the old hash

关于sql - 如何在 postgres INSERT ON CONFLICT DO UPDATE 中返回列的旧值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52191388/

相关文章:

ruby-on-rails - rails : How do I search tags generated by Act_As_Taggable_On with PG_Search? (postgresql)

sql - 开始日期和结束日期

java - Hibernate 是否记录它分配给准备好的 SQL 语句中的占位符的值?

sql - 通过键获取最小/最大值 - 不同的方法

postgresql - 哪些 Postgres 13 索引类型支持距离搜索?

postgresql - 创建自定义的postgresql slave

sql - 需要为 2 个 ID 选择 2 个最近的日期

php - 在MYSQL中,我想获得具有多个条件的多个SUM来进行总计并获得价格里程碑

SQL Server - 存储过程突然变慢

postgresql - 使用 Postgres COPY FROM 时如何转换十六进制字符?