首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

在PostgreSQL中,可以使用INSERT ON CONFLICT DO UPDATE语句来处理冲突并更新行数据。如果你想要在这个过程中返回列的旧值,可以使用RETURNING子句。

具体步骤如下:

  1. 创建一个包含冲突列的表,并插入一些数据作为示例:
代码语言:txt
复制
CREATE TABLE my_table (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) UNIQUE,
    age INTEGER
);

INSERT INTO my_table (name, age) VALUES ('John', 25), ('Jane', 30);
  1. 使用INSERT ON CONFLICT DO UPDATE语句来处理冲突并返回旧值:
代码语言:txt
复制
INSERT INTO my_table (name, age)
VALUES ('John', 35)
ON CONFLICT (name) DO UPDATE SET age = EXCLUDED.age
RETURNING age;

在这个例子中,我们尝试插入一个具有相同名称的行。如果冲突发生,我们使用DO UPDATE子句来更新age列的值为新值。然后,使用RETURNING子句返回age列的旧值。

  1. 运行上述SQL语句后,将返回旧值:
代码语言:txt
复制
 age
-----
  25

这样,你就可以在INSERT ON CONFLICT DO UPDATE语句中返回列的旧值了。

对于PostgreSQL的更多信息和详细介绍,你可以参考腾讯云的云数据库 PostgreSQL 文档:https://cloud.tencent.com/document/product/409/16762

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 微信为什么使用 SQLite 保存聊天记录?

    开发者可以使用空值null来代替,因为unknown和null的布尔值是一样的。 在INSERT和UPDATE语句中,字面量true和false可以大大提高values和set子句的可读性。...INSERT INTO target SELECT * FROM source ON CONFLICT (id) DO UPDATE SET val = excluded.val...INSERT INTO target SELECT * FROM source WHERE true ON CONFLICT (id) DO UPDATE SET val = excluded.val...0:同样记录insert、update、delete和merge操作的错误信息 (“DML error logging”) 1:On conflict语句不能紧挨查询的from语句,如果需要,可以添加...派生的数据库表(如Select语句返回的查询结果集)中的列名可以通过SELECT语句、FROM语句或WITH语句来进行改变 2:据我所知,也许可以通过可更新视图或派生的列来模拟该功能。

    2.6K20

    PostgreSQL 基础与实践

    域完整性则是通过对表中列做一些额外限制,如限制数据类型、检查约束、设置默认值、是否允许空值以及值域范围等。...命令行界面 首先我们讲 psql 的路径加入环境变量以便后续使用,我使用的是 zsh,所以在 ~/.zshrc 文件中添加如下内容: # postgres export PATH=${PATH}:/Applications.../Postgres.app/Contents/Versions/14/bin 之后在终端中输入 psql,就可以访问 PostgreSQL 的命令行界面了。...) VALUES ('Yu', 'ZHANG', 'MALE', DATE '1997-06-06') ON CONFLICT (id) DO NOTHING; --- 当发生冲突时更新指定字段 INSERT...(id) DO UPDATE SET email = EXCLUDED.email; DQL 操作 可以通过 SELECT 命令来对表进行查询,最常用的查看全表命令为 --- 查看表的全部数据 SELECT

    1.3K20

    微信为什么使用 SQLite 保存聊天记录?

    开发者可以使用空值null来代替,因为unknown和null的布尔值是一样的。 在INSERT和UPDATE语句中,字面量true和false可以大大提高values和set子句的可读性。...INSERT INTO target SELECT *   FROM source     ON CONFLICT (id)     DO UPDATE SET val = excluded.val 根据说明文档...INSERT INTO target SELECT *   FROM source  WHERE true     ON CONFLICT (id)     DO UPDATE SET val = excluded.val...图片 0:同样记录insert、update、delete和merge操作的错误信息 (“DML error logging”) 1:On conflict语句不能紧挨查询的from语句,如果需要,...派生的数据库表(如Select语句返回的查询结果集)中的列名可以通过SELECT语句、FROM语句或WITH语句来进行改变 2:据我所知,也许可以通过可更新视图或派生的列来模拟该功能。

    2.2K10

    微信为什么使用 SQLite 保存聊天记录?

    开发者可以使用空值null来代替,因为unknown和null的布尔值是一样的。 在INSERT和UPDATE语句中,字面量true和false可以大大提高values和set子句的可读性。...INSERT INTO target SELECT * FROM source ON CONFLICT (id) DO UPDATE SET val = excluded.val...INSERT INTO target SELECT * FROM source WHERE true ON CONFLICT (id) DO UPDATE SET val = excluded.val...图片 0:同样记录insert、update、delete和merge操作的错误信息 (“DML error logging”) 1:On conflict语句不能紧挨查询的from语句,如果需要,...派生的数据库表(如Select语句返回的查询结果集)中的列名可以通过SELECT语句、FROM语句或WITH语句来进行改变 2:据我所知,也许可以通过可更新视图或派生的列来模拟该功能。

    10610

    微信为什么使用 SQLite 保存聊天记录?

    开发者可以使用空值null来代替,因为unknown和null的布尔值是一样的。 在INSERT和UPDATE语句中,字面量true和false可以大大提高values和set子句的可读性。...INSERT INTO target SELECT *   FROM source     ON CONFLICT (id)     DO UPDATE SET val = excluded.val 根据说明文档...INSERT INTO target SELECT *   FROM source  WHERE true     ON CONFLICT (id)     DO UPDATE SET val = excluded.val...图片 0:同样记录insert、update、delete和merge操作的错误信息 (“DML error logging”) 1:On conflict语句不能紧挨查询的from语句,如果需要,...派生的数据库表(如Select语句返回的查询结果集)中的列名可以通过SELECT语句、FROM语句或WITH语句来进行改变 2:据我所知,也许可以通过可更新视图或派生的列来模拟该功能。

    1.9K10

    微信为什么使用 SQLite 保存聊天记录?

    开发者可以使用空值null来代替,因为unknown和null的布尔值是一样的。 在INSERT和UPDATE语句中,字面量true和false可以大大提高values和set子句的可读性。...INSERT INTO target SELECT *   FROM source     ON CONFLICT (id)     DO UPDATE SET val = excluded.val 根据说明文档...INSERT INTO target SELECT *   FROM source  WHERE true     ON CONFLICT (id)     DO UPDATE SET val = excluded.val...0:同样记录insert、update、delete和merge操作的错误信息 (“DML error logging”) 1:On conflict语句不能紧挨查询的from语句,如果需要,可以添加...派生的数据库表(如Select语句返回的查询结果集)中的列名可以通过SELECT语句、FROM语句或WITH语句来进行改变 2:据我所知,也许可以通过可更新视图或派生的列来模拟该功能。

    1.8K50

    【测试SQLite】测试SQLite支持的SQL语句分类

    最大值是在同一列上的 ORDER BY 中返回的最后一个值。如果组中没有非 NULL 值,则聚合 max() 返回 NULL。 min(X) min() 聚合函数返回组中所有值的最小非 NULL 值。...最小值是在列的 ORDER BY 中出现的第一个非 NULL 值。如果组中没有非 NULL 值,则聚合 min() 返回 NULL。...如果插入操作会导致冲突目标的唯一性约束失败,则插入会被省略,相应的DO NOTHING或DO UPDATE操作将代替执行。ON CONFLICT子句按指定的顺序检查。...UPSERT不会干预失败的NOT NULL、CHECK或外键约束,也不会干预使用触发器实现的约束。 DO UPDATE中表达式中的列名是插入前列的原始未更改的值。...UPSERT不会干预失败的NOT NULL、CHECK或外键约束,也不会干预使用触发器实现的约束。 DO UPDATE中表达式中的列名是插入前列的原始未更改的值。

    36200

    进阶数据库系列(十):PostgreSQL 视图与触发器

    这个选项被指定时,将检查该视图上的 INSERT 和UPDATE 命令以确保新行满足视图的定义条件(也就是,将检查新行来确保通过视图能看到它们)。如果新行不满足条件,更新将被拒绝。...如果没有指定 CHECK OPTION,会允许该视图上的 INSERT 和 UPDATE 命令创建通过该视图不可见的行。支持下列检查选项: LOCAL:#只根据直接定义在该视图本身的条件检查新行。...如果该视图或者任何基础关系具有导致 INSERT 或 UPDATE 命令被重写的 INSTEAD 规则,那么在被重写的查询中将忽略所有检查选项,包括任何来自于定义在带有 INSTEAD 规则的关系之上的自动可更新视图的检查...SET/DROP DEFAULT:#这些形式为一个列设置或者移除默认值。对于任何在该视图上的 INSERT 或者 UPDATE 命令,一个视图列的默认值会在引用该视图的任何规则或触发器之前被替换进来。...security_barrier (boolean):#更改该视图的安全屏障属性。值必须是一个布尔值,如 true 或者 false。

    1.2K10

    【PostgreSQL技巧】PostgreSQL中的物化视图与汇总表比较

    多年来,物化视图一直是Postgres期待已久的功能。他们最终到达了Postgres 9.3,尽管当时很有限。在Postgres 9.3中,当刷新实例化视图时,它将在刷新时在表上保持锁定。...如果您的工作量是非常繁忙的工作时间,则可以工作,但是如果您要为最终用户提供动力,那么这将是一个大问题。在Postgres 9.4中,我们看到了Postgres实现了同时刷新实例化视图的功能。...upsert将尝试插入当天/页面的任何新记录,如果已经看到这些值,则将增加它们: INSERT INTO rollups SELECT day, page, count(*) as views FROM...pageviews WHERE event_id > e GROUP BY day, page ON CONFLICT (day, page) DO UPDATE SET views = views...尽管如您所见,汇总方法仅需要一点点努力,并且可以进一步扩展。

    2.4K30

    PostgreSQL数据的存储基础知识

    OID的别名类型除了特定的输入和输出例程之外没有别的操作。这些例程可以接受并显示系统对象的符号名,而不是类型oid使用的原始数字值。别名类型使查找对象的OID值变得简单。...XID 事务ID: 由32位组成,这就有可能造成事务ID回卷的问题,具体参考文档 顺序产生,依次递增 没有数据变更,如INSERT、UPDATE、DELETE等操作,在当前会话中,事务ID不会改变 数据库系统中使用的数据类型为...xmin 存储的是产生这个元组的事务ID,可能是insert或者update语句 xmax 存储的是删除或者锁定这个元组的XID 简单示例如下: select id, xmin, xmax from course...由于 OID 是系统表的隐藏列,因此查看系统表中数据库对象的OID时,必须在SELECT语句中显式指定。...pd_prune_xid:可删除的旧 XID,如果没有则为零。

    2.4K60

    如何在Ubuntu 18.04上安装和使用PostgreSQL

    接下来的两个命令的设备分别创建type和color,其中每一个可以不为空。之后的命令会创建一个location列并创建一个约束,该约束要求该值为八个可能值之一。...例如,不要将列名包装在引号中,但是您输入的列值确实需要引号。 另外要记住的是,您不要为equip_id列输入值。这是因为只要创建表中的新行,就会自动生成此项。...添加和删除表中的列 创建表后,您可以修改它以相对容易地添加或删除列。...列及其中的值,但保留所有其他数据。...更新表中的数据 到目前为止,您已经学习了如何向表中添加记录以及如何删除它们,但本教程尚未介绍如何修改现有条目。 您可以通过查询所需的记录并将列设置为您要使用的值来更新现有条目的值。

    5.5K60

    PG从库查询被终止的解决办法

    根据报错信息,在主库上执行长时间查询过程中,由于此查询涉及的记录有可能在主库上被更新或删除,根据 PostgreSQL的mvcc机制,更新或删除的数据不是立即从物理块上删除,而是之后autovacuum...WAL发生冲突,此查询如果30秒没有执行完成则被中止,注意30秒不是备库上单个查询允许的最大执行时间,是指当备库上应用WAL时允许的最大WAL延迟应用时间,因此备库上查询的执行时间有可能不到这个参数设置的值就被中止了...); insert into test_per2 (id) select * from generate_series(1,1000000) ; 编写pgbench压测脚本 update_per2.sql...T 120 -d postgres -Upostgres -n N -M prepared -f update_per2.sql 然后,到pgSlave备库去执行下查询操作: postgres=# select...都是有不太好的地方: 1、 设置 max_standby_streaming_delay 参数为-1,这种方式有可能备库上慢查询由于长时间执行而消耗大量主机资源,建议根据应用情况设置一个较合理的值 2、

    3.5K20
    领券