当前位置:网站首页>Postgresql source code (66) insert on conflict grammar introduction and kernel execution process analysis
Postgresql source code (66) insert on conflict grammar introduction and kernel execution process analysis
2022-08-04 03:35:00 【mingjie73】
1 语法介绍
insert on conflict语法实现了upsert的功能,That is, a primary key conflict occurs on the insert、or a unique constraint violation,执行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
-- No primary key conflict was reported,As a result, the insertion has no effect.
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
-- A primary key violation occurred while inserting,执行后面的update语句,将y更新为400,EXCLUDEDIndicates that this row of data is ready to be newly inserted.
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 Kernel execution flow
注意:后面提到的
speculative insert等价与insert on conflict语法.
2.1 Observed from the execution flowspeculative insert
执行流程:
- spec insertThe execution flow and commoninsert是分开的,走两个分支.
- specThe special thing is that there is a retry mechanism,即:
- In the first check if no unique key conflict is found,正常是可以直接insert的.
- But due to no lock check,Possibly in realinsertA unique key violation occurred again(Checked before,other concurrencyinsertA piece of conflicting data)
- 那么这时xlogOne has already been successfulinsert了,Need to add another onedelete(The fourth step in the figure conflict occurs).

2.2 Observed from a log perspectivespeculative 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日志.
- 情况二:插入失败
- 不生成日志
- 情况三:There are no conflicts yet when inserting,But other processes insert conflicting rows concurrently(Concurrency conflict locations are analyzed later)
- 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日志.
- There are no conflicts yet when inserting,But other processes insert conflicting rows concurrently(Concurrency conflict locations are analyzed later)
- heap_insert,生成XLOG_HEAP_INSERT日志.
- heap_abort_speculative,生成XLOG_HEAP_DELETE日志.
- 插入成功
So it may be seen from the log3种情况:
情况一: 第一条XLOG_HEAP_INSERT 第二条XLOG_HEAP_CONFIRM
情况二: 第一条XLOG_HEAP_INSERT 第二条XLOG_HEAP_DELETE
情况三: 第一条XLOG_HEAP_HOT_UPDATE
The next article will continue to introduce these types of logs after they are parsed by logical replication.
边栏推荐
- 【项目实现】Boost搜索引擎
- 类如何只能静态分配和只能动态分配
- Power button (LeetCode) 215. The first K largest elements in the array (2022.08.03)
- 三分建设,七分管理!产品、系统、组织三管齐下节能降耗
- 出现504怎么办?由于服务器更新导致的博客报504错误[详细记录]
- MRS: Introduction to the use of Alluxio
- db2中kettle报错 Field [XXX] is required and couldn‘t be found 解决方法
- Detailed analysis of scaffolding content
- sql注入一般流程(附例题)
- 案例 | 重庆银行流动数据安全挑战及应对实践
猜你喜欢
随机推荐
sqoop ETL tool
仿牛客论坛项目梳理
Mini program + new retail, play the new way of playing in the industry!
三分建设,七分管理!产品、系统、组织三管齐下节能降耗
数据集类型转换—TFRecords文件
Postgresql源码(66)insert on conflict语法介绍与内核执行流程解析
sql语句查询String类型字段小于10的怎么查
Why use Selenium for automated testing
Oracle与Postgresql在PLSQL内事务回滚的重大差异
SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropri
docker+网桥+redis主从+哨兵模式
Embedded database development programming MySQL (full)
FPGA解析B码----连载3
【医保科普】维护医保基金安全,我们可以这样做
Innovation and Integration | Huaqiu Empowerment Helps OpenHarmony Ecological Hardware Development and Landing
golang中的unsafe.Pointer,指针,引用
数据安全峰会2022 | 美创DSM获颁“数据安全产品能力验证计划”评测证书
【翻译】Terraform和Kubernetes的交集
数据湖(二十):Flink兼容Iceberg目前不足和Iceberg与Hudi对比
kingbaseES V8R2/R3 表在指定表空间,为何显示为默认表空间?







