KingbaseES Insert On Conflict 功能
针对数据写入时有主键冲突的情况,INSERT ON CONFLICT语法可以将冲突主键的INSERT行为转换为UPDATE行为,从而实现冲突主键的覆盖写入。该特性又称UPSERT覆盖写,与MySQL的REPLACE INTO类似。
语法
[ WITH [ RECURSIVE ] with_query [, ...] ]
INSERT INTO table_name [ [ AS ] alias ] [ ( column_name [, ...] ) ]
[ OVERRIDING { SYSTEM | USER} VALUE ]
{ DEFAULT VALUES |
VALUES ( { expression | DEFAULT } [, ...] ) [, ...] |
query |
VALUES record |
SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
}
[ ON CONFLICT [ conflict_target ] conflict_action ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
其中 conflict_target 可以是以下之一:
( { index_column_name | ( index_expression ) } [ COLLATE collation ]
[ opclass ]
[, ...] ) [ WHERE index_predicate ]
ON CONSTRAINT constraint_name
并且 conflict_action 是以下之一:
DO NOTHING
DO UPDATE SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT }
[, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
[ WHERE condition ]
ON CONFLICT子句可以实现覆盖写入。该子句由conflict_target和conflict_action组成。
| 参数 | 说明 |
|---|---|
| conflict_target | conflict_action取值为Do Update时,conflict_target需要指定用来定义冲突的主键列或唯一索引列 conflict_action取值为Do Nothing时,conflict_target可省略 |
| conflict_action | DO NOTHING:如果conflict_target指定的列有冲突,则丢弃待插入的数据 DO UPDATE:如果conflict_target指定的列有冲突,则按照后面的UPDATE子句进行数据覆盖 |
示例
CREATE TABLE user_logins (
user_id int PRIMARY KEY,
login_cnt int,
last_login_time date
); --记录用户登录信息的表
test=# insert into user_logins values (1,1,sysdate);
INSERT 0 1
test=# insert into user_logins values (1,2,sysdate); --插入主键重复的数据报错
错误: 重复键违反唯一约束"user_logins_pkey"
描述: 键值"(user_id)=(1)" 已经存在
冲突时做更新操作:
test=# INSERT INTO user_logins VALUES
test-# (1,2,sysdate),(2,1,sysdate)
test-# ON conflict(user_id)
test-# DO UPDATE SET login_cnt = user_logins.login_cnt + EXCLUDED.login_cnt;
INSERT 0 2
test=# select * from user_logins;
user_id | login_cnt | last_login_time
---------+-----------+---------------------
1 | 3 | 2022-10-14 15:02:45
2 | 1 | 2022-10-14 15:06:47
(2 行记录)
user_logins.login_cnt 原表中的值
EXCLUDED.login_cnt insert语句中的值
冲突时不做处理:
test=# INSERT INTO user_logins VALUES
test-# (1,2,sysdate),(3,1,sysdate)
test-# ON conflict(user_id)
test-# DO NOTHING;
INSERT 0 1
test=# select * from user_logins;
user_id | login_cnt | last_login_time
---------+-----------+---------------------
1 | 3 | 2022-10-14 15:02:45
2 | 1 | 2022-10-14 15:06:47
3 | 1 | 2022-10-14 15:09:52
(3 行记录)
KingbaseES Insert On Conflict 功能的更多相关文章
- KingbaseES insert all/first 功能介绍
KingbaseES 内置了对于insert all / first 语法的支持. 一.数据准备 create table t1(product_id number, product_name var ...
- PostgreSQL INSERT ON CONFLICT不存在则插入,存在则更新
近期有一个需求,向一张数据库表插入数据,如果是新数据则执行插入动作,如果插入的字段和已有字段重复,则更新该行对应的部分字段 1. 创建测试表 create table meta_data ( id s ...
- laravel 为Eloquent 模型添加replace 和insert ignore 查询功能
安装:composer require jdavidbakr/replaceable-model 在模型里引入: class model extends Model { ... use \jdavid ...
- SQL入门语句之INSERT、UPDATE和DELETE
一.SQL入门语句之INSERT insert语句的功能是向数据库的某个表中插入一个新的数据行 1.根据对应的字段插入相对应的值 insert into table_name(字段A, 字段B, 字段 ...
- Oracle 的 INSERT ALL和INSERT FIRST
描述性的东西就不来了,搞技术的,最喜欢实在的实例.通过下面的例子,大家很快就能明白insert all 与 insert first 的功能,比文字描述更通俗易懂. 一.INSERT ALL 不带条件 ...
- MySQL replace into (insert into 的增强版)
在使用SQL语句进行数据表插入insert操作时,如果表中定义了主键,插入具有相同主键的记录会报错: Error Code: 1062. Duplicate entry 'XXXXX' for ke ...
- MySQL-插入数据(INSERT)
Insert语句可将一行或多行插入到表中. INSERT语法: INSERT INTO table(column1,column2...) VALUES (value1,value2,...); 首先 ...
- 字符串、数组操作函数 Copy Concat Delete Insert High MidStr Pos SetLength StrPCopy TrimLeft
对字符串及数组的操作,是每个程序员必须要掌握的.熟练的使用这些函数,在编程时能更加得心应手. 1.Copy 功能说明:该函数用于从字符串中复制指定范围中的字符.该函数有3个参数.第一个参数是数据源(即 ...
- mysql:insert replace
在使用SQL语句进行数据表插入insert操作时,如果表中定义了主键,插入具有相同主键的记录会报错: Error Code: 1062. Duplicate entry 'XXXXX' for key ...
- KingbaseES 与 Oracle 用户口令管理与资源管理
一.概述 KingbaseES可以对用户口令与用户占用资源进行必要的管理.其管理方式,在这里与Oracle数据库进行参考比较. KingbaseES 使用扩展插件建立的系统参数,这组参数可以对数据库资 ...
随机推荐
- Java设计模式-观察者模式Observer
介绍 观察者模式是行为设计模式之一.当您对对象的状态感兴趣并希望在任何更改时得到通知时,观察者设计模式非常有用.在观察者模式中,观察另一个对象状态的对象被称为观察者,而被观察的对象则被称为主体. 优点 ...
- Centos7安装php7.4
添加 EPEL and REMI 仓库 yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarc ...
- Linux证书问题:curl#60 - “The certificate issuer‘s certificate has expired
问题说明 最近在centos7上打算安装php7版本,需要下载一个外网https的yum源,结果报错如下: 执行命令 rpm -Uvh https://mirror.webtatic.com/yum/ ...
- vue项目设置favicon
1.准备一个favicon.ico 放在项目的static文件夹下: 2.修改打包配置 开发环境 修改build/webpack.dev.conf.js,找到new HtmlWebpackPlugin ...
- Spring Boot学生信息管理系统项目实战-1.项目介绍
1.获取源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.项目背景 刚开始自己帮教师朋友写的,核心是学生信息的导入导出功能.后来又扩展了几个模块. 水平一般能力有限,觉着有用的朋友可以拿去自 ...
- Redis原理学习:Redis主体流程分析
转自:七把刀 https://www.jianshu.com/p/427cf97d7951 网上分析Redis源码的文章挺多,如黄健宏的<Redis设计与实现>就很详尽的分析了redis源 ...
- Hi3516开发笔记(十一):通过HiTools使用网口将uboot、kernel、roofts烧写进eMMC
前言 前面烧写一直时烧写进入flush,是按照分区烧写.定制的板子挂的是eMMC,前面的烧写步骤一致,但是在烧写目标则时烧写eMMC了. 重新走一遍从无到有通过网口刷定制板卡的uboot.ker ...
- Navicat安装包和激活工具
链接:https://pan.baidu.com/s/11YuOKdgGakt3E8CL80aA2g 提取码:h4f3
- SDWebImage从小白到大师蜕变
简介 SDWebImage提供的简洁的获取远程URL图片的API:平时开发中使用最多场景就是列表中的cell中要显示远程图片的需求,在具体的实现中要避免加载图片造成的界面卡顿,列表卡顿等现象的出现:所 ...
- Android底层渲染原理
Overview多年前Android的UI流畅性差的问题一直饱受诟病,Google为了解决这个问题开发了Project Butter项目,也就是黄油计划,期望彻底改善Android系统的流畅性.这是A ...