当前位置:网站首页>Postgresql源码(66)insert on conflict语法介绍与内核执行流程解析
Postgresql源码(66)insert on conflict语法介绍与内核执行流程解析
2022-08-04 03:30:00 【mingjie73】
1 语法介绍
insert on conflict语法实现了upsert的功能,即在插入发生主键冲突、或唯一约束冲突时,执行on conflict后面的语句,将insert变成update或do nothing避免报错。
语法手册:https://www.postgresql.org/docs/current/sql-insert.html
测试用例:
drop table decoding_test;
CREATE TABLE decoding_test(x integer primary key, y text);
postgres=# select * from decoding_test;
x | y
----+---
12 | 9
postgres=# INSERT INTO decoding_test(x,y) values(12,9) on conflict (x) do nothing;
INSERT 0 1
postgres=# select * from decoding_test;
x | y
----+---
12 | 9
-- 没有报主键冲突,结果上看插入没有效果。
postgres=# INSERT INTO decoding_test(x,y) values(12,9) on conflict (x) do nothing;
INSERT 0 0
postgres=# select * from decoding_test;
x | y
----+---
12 | 9
(1 row)
postgres=# INSERT INTO decoding_test(x,y) values(101,20) on conflict (x) do update set y=EXCLUDED.y;
INSERT 0 1
postgres=#
postgres=# select * from decoding_test;
x | y
-----+----
12 | 9
101 | 20
-- 插入时发生主键冲突,执行后面的update语句,将y更新为400,EXCLUDED表示准备要新插入的这一行数据。
postgres=# INSERT INTO decoding_test(x,y) values(101,400) on conflict (x) do update set y=EXCLUDED.y;
INSERT 0 1
postgres=# select * from decoding_test;
x | y
-----+-----
12 | 9
101 | 400
(2 rows)
2 内核执行流程
注意:后面提到的
speculative insert等价与insert on conflict语法。
2.1 从执行流程观察speculative insert
执行流程:
- spec insert的执行流程和普通insert是分开的,走两个分支。
- spec比较特殊的就是有重试机制,即:
- 在第一次检查如果没发现有唯一键冲突,正常是可以直接insert的。
- 但由于无锁检查,可能在真正insert时又发生了唯一键冲突(前面检查完了,其他并发insert一条冲突数据)
- 那么这时xlog中已经有一条成功的insert了,需要再后面加一条delete(图中第四步冲突发生了)。

2.2 从日志角度观察speculative insert
INSERT INTO decoding_test(x,y) values(12,9) on conflict (x) do nothing;- 情况一:插入成功
- heap_insert,生成XLOG_HEAP_INSERT日志。
- heap_finish_speculative,生成XLOG_HEAP_CONFIRM日志。
- 情况二:插入失败
- 不生成日志
- 情况三:插入时还没有冲突,但其他进程并发插入冲突行(并发冲突位置在后面分析)
- heap_insert,生成XLOG_HEAP_INSERT日志。
- heap_abort_speculative,生成XLOG_HEAP_DELETE日志。
- 情况一:插入成功
INSERT INTO decoding_test(x,y) values(20,9) on conflict (x) do update set y=100;- 插入成功
- heap_insert,生成XLOG_HEAP_INSERT日志。
- heap_finish_speculative,生成XLOG_HEAP_CONFIRM日志。
- 更新成功:转换为update语句执行
- log_heap_update,生成XLOG_HEAP_HOT_UPDATE日志。
- 插入时还没有冲突,但其他进程并发插入冲突行(并发冲突位置在后面分析)
- heap_insert,生成XLOG_HEAP_INSERT日志。
- heap_abort_speculative,生成XLOG_HEAP_DELETE日志。
- 插入成功
所以从日志中可能看到3种情况:
情况一: 第一条XLOG_HEAP_INSERT 第二条XLOG_HEAP_CONFIRM
情况二: 第一条XLOG_HEAP_INSERT 第二条XLOG_HEAP_DELETE
情况三: 第一条XLOG_HEAP_HOT_UPDATE
下一篇继续介绍这几种日志被逻辑复制解析后的情况。
边栏推荐
- TOML配置文件格式,YAML最有力的竞争者
- 2022.8.3-----leetcode.899
- 一文详解DHCP原理及配置
- MySQL Query Exercise (1)
- STM8S105K4T6------串口发送和接收
- sql语句查询String类型字段小于10的怎么查
- C language -- ring buffer
- ingress 待完善
- Good bosses, please ask the flink CDC oracle to Doris, found that the CPU is unusual, a run down
- 2 Gigabit Optical + 6 Gigabit Electric Rail Type Managed Industrial Ethernet Switch Supports X-Ring Redundant Ring One-key Ring Switch
猜你喜欢

Gigabit 2 X light 8 electricity management industrial Ethernet switches WEB management - a key Ring Ring net switch

sqoop ETL tool

复制带随机指针的链表

y86.第四章 Prometheus大厂监控体系及实战 -- prometheus存储(十七)

STM8S105K4T6------Serial port sending and receiving

docker+bridge+redis master-slave+sentry mode
![[Study Notes Dish Dog Learning C] Dynamic Memory Management](/img/57/a1837e5eec2af0e684e5895a8afed0.png)
[Study Notes Dish Dog Learning C] Dynamic Memory Management

汇编语言之栈

深度学习——以CNN服装图像分类为例,探讨怎样评价神经网络模型

STM8S项目创建(STVD创建)---使用 COSMIC 创建 C 语言项目
随机推荐
内网服务器访问远程服务器的端口映射
【翻译】Terraform和Kubernetes的交集
复现20字符短域名绕过
异步编程解决方案 Generator生成器函数、iterator迭代器、async/await、Promise
十一种概率分布
[Medical Insurance Science] To maintain the safety of medical insurance funds, we can do this
返回字符串中的最大回文数
验证码业务逻辑漏洞
The keytool command
基地址:环境变量
Shell 函数
数据湖(二十):Flink兼容Iceberg目前不足和Iceberg与Hudi对比
How many ways do you know about communication between multiple threads?
MRS: Introduction to the use of Alluxio
keytool命令
自定义通用分页标签01
Y86. Chapter iv Prometheus giant monitoring system and the actual combat, Prometheus storage (17)
力扣(LeetCode)215. 数组中的第K个最大元素(2022.08.03)
TOML configuration file format, YAML's top contender
y86.第四章 Prometheus大厂监控体系及实战 -- prometheus存储(十七)