当前位置:网站首页>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
下一篇继续介绍这几种日志被逻辑复制解析后的情况。
边栏推荐
- 【指针内功修炼】深度剖析指针笔试题(三)
- 一个属于程序员的七夕节!
- sqoop ETL tool
- Sfdp 超级表单开发平台 V6.0.5 正式发布
- 验证码业务逻辑漏洞
- 数据湖(二十):Flink兼容Iceberg目前不足和Iceberg与Hudi对比
- 哎,又跟HR在小群吵了一架!
- Countdown to 2 days, the "New Infrastructure of Cultural Digital Strategy and Ecological Construction of Cultural Art Chain" will kick off soon
- esp8266-01s刷固件步骤
- Mockito单元测试
猜你喜欢
sqoop ETL工具
从图文展示到以云为核,第五代验证码独有的策略情报能力
2 Gigabit Optical + 6 Gigabit Electric Rail Type Managed Industrial Ethernet Switch Supports X-Ring Redundant Ring One-key Ring Switch
基地址:环境变量
汇编语言之栈
Y86. Chapter iv Prometheus giant monitoring system and the actual combat, Prometheus storage (17)
【Playwright测试教程】5分钟上手
2022杭电多校联赛第五场 题解
"Introduction to nlp + actual combat: Chapter 8: Using Pytorch to realize handwritten digit recognition"
逻辑漏洞----其他类型
随机推荐
Brush esp8266-01 s firmware steps
如何在MySQL中的数据库下删除所有的表
tkmapper的crud示例:
Polygon zkEVM network node
unsafe.Pointer, pointer, reference in golang
【观察】超聚变:首提“算网九阶”评估模型,共建开放繁荣的算力网络
Innovation and Integration | Huaqiu Empowerment Helps OpenHarmony Ecological Hardware Development and Landing
深度学习——以CNN服装图像分类为例,探讨怎样评价神经网络模型
FFmpeg —— 通过修改yuv,将视频转为黑白并输出(附源码)
Polygon zkEVM网络节点
Detailed analysis of scaffolding content
Architecture of the actual combat camp module three operations
[Playwright Test Tutorial] 5 minutes to get started
怎么把elastic中的异常登录ip和日志自动导出或抓取到数据库中?
Hey, I had another fight with HR in the small group!
Shell 函数
说说数据治理中常见的20个问题
Deep Learning (3) Classification Theory Part
MySQL 查询练习(1)
自定义通用分页标签01