数据库使用过程中,经常会遇到一种场景:业务系统对数据进行dml操作,当数据库中数据不存在时,将数据做为新记录插入到表中,当数据库中数据存在时,对现有数据进行更新操作。

下面介绍KingbaseES中对上述的业务场景的应对方式。

-- 测试数据:
CREATE TABLE test(id int PRIMARY KEY ,name varchar(20)); INSERT INTO test values(1 , 'a');

1.KingbaseES 原生ON CONFLICT

用法:

INSERT INTO table_name [ [ AS ] alias ] [ ( column_name [, ...] ) ]
[ ON CONFLICT [ conflict_target ] conflict_action ]

ON CONFLICT子句为出现唯一性违背或排除约束违背错误时提供另一种可供选择的动作。对于每一个要插入的行,不管是插入进行下去还是由conflict_target 指定的一个仲裁者约束或者索引被违背,都会采取可供选择的conflict_action。 ON CONFLICT DO NOTHING简单地把避免插入行。 ON CONFLICT DO UPDATE则会 更新与要插入的行冲突的已有行。

注意,特殊的excluded表被用来引用原来要插入的值:


test=# select * from test ;
id | name
----+------
1 | a
(1 行记录) -- 存在相同的id值时,不进行操作
test=# insert into test values(1 , 'b') on conflict(id) do nothing ;
INSERT 0 0 -- 存在相同的id值时,更新数据
test=# insert into test values(1 , 'b') on conflict(id) do update set name = 'b' ;
INSERT 0 1
test=# select * from test ;
id | name
----+------
1 | b
(1 行记录) -- 存在相同的id值时,通过引用excluded方式更新数据
test=# insert into test values(1 , 'c') on conflict(id) do update set name = excluded.name ;
INSERT 0 1
test=# select * from test ;
id | name
----+------
1 | c
(1 行记录)

2.兼容 mysql 的ON DUPLICATE KEY UPDATE方式

前置条件:KingbaseES 数据库初始化为MySQL模式。

用法:

INSERT INTO table_name[(col_name_list)]
VALUES(value_list) ON
DUPLICATE KEY
UPDATE
EXPRESSION[RETURNING col_name_list];

INSERT ON DUPLICATE KEY UPDATE 功能和 KingbaseES 的 ON CONFLICT 相似。如果在 INSERT 语句后面指定了ON DUPLICATE KEY UPDATE,并且插入当前的元组后会导致 UNIQUE KEY 或 PRIMARY KEY 中出现了重复的值,则在出现 UNIQUE KEY 重复的已存在元组执行 UPDATE 操作;如果插入的元组与已存在元组不存在 UNIQUE KEY 重复问题,则插入新的元组。


test=# select * from test ;
id | name
----+------
1 | a
(1 行记录) -- 存在相同的id值时,更新数据
test=# insert into test values(1 , 'b') as new ON DUPLICATE KEY UPDATE name = new.name ;
INSERT 0 1
test=# select * from test ;
id | name
----+------
1 | b
(1 行记录)

3.兼容 oracle 的MERGE方式

根据连接条件对目标表执行插入或修改操作

用法:

MERGE INTO [ schema. ] { target_table } [ [ AS ] target_table_alias ]
USING { [ schema. ] { source_table } [ [ AS ] source_table_alias ]
ON ( condition_expression )
[ merge_update_clause ]
[ merge_insert_clause ]; merge_update_clause:
WHEN MATCHED THEN
UPDATE SET column = { expr | DEFAULT }[, column = { expr | DEFAULT } ]...
[ where_clause ]
[ delete_clause ] delete_clause:
[DELETE where_clause] merge_insert_clause:
WHEN NOT MATCHED THEN
INSERT [ ( column [, column ]...) ]
VALUES ({ expr | DEFAULT }[, { expr | DEFAULT } ]...)
[ where_clause ]

使用 MERGE 语法可合并 UPDATE 和 INSERT 语句。通过 MERGE语句,根据一张表(或视图)的连接条件对另外一张表(或视图)进行查询,连接条件匹配上的执行 UPDATE(可能含有 DELETE),无法匹配的执行 INSERT。

create table test1(a int, b int);
insert into test1 values(1, 1); create table test2(x int, y int);
insert into test2 values(1, 1); test=# select * from test2 ;
x | y
---+---
1 | 1
(1 行记录) test=# MERGE INTO test2
test-# USING test1
test-# ON
test-# (
test(# test1.a = test2.x
test(# )
test-# WHEN MATCHED THEN
test-# UPDATE
test-# SET
test-# y = y * -1
test-# WHEN NOT MATCHED THEN INSERT
test-# VALUES(
test(# test1.a,
test(# test1.b
test(# );
MERGE 1
test=# select * from test2 ;
x | y
---+----
1 | -1
(1 行记录)

test=# select * from test ;
id | name
----+------
1 | a
(1 行记录) test=# MERGE INTO test t1
test-# USING (
test(# SELECT
test(# 1 id,
test(# 'b' name
test(# FROM
test(# dual
test(# ) tmp ON
test-# (
test(# t1.id = tmp.id
test(# ) when MATCHED THEN
test-# UPDATE
test-# SET
test-# t1.name = tmp.name
test-# WHERE
test-# t1.id = tmp.id
test-# WHEN NOT MATCHED THEN INSERT
test-# VALUES(
test(# tmp.id ,
test(# tmp.name
test(# ) ;
MERGE 1
test=# select * from test ;
id | name
----+------
1 | b
(1 行记录)

KingbaseES 数据插入更新操作的更多相关文章

  1. Sql Server数据库使用触发器和sqlbulkcopy大批量数据插入更新

    需要了解的知识 1.触发器 2.sqlbulkcopy 我的用途 开发数据库同步的工具,需要大批量数据插入和数据更新. 方式 使用SqlBulkCopy类对数据进行数据批量复制,将需要同步数据的表新建 ...

  2. day38 mycql 初识概念,库(增删改查),表(增删改)以及表字段(增删改查),插入更新操作

    在Navicat中把已经生成的表逆向成模型 数据库上,右键-逆向数据库到模型 ego笔记: 增删改查 文件夹(库) 增 create database day43 charset utf8; 改 al ...

  3. 11、ON DUPLICATE KEY UPDATE实现插入更新操作

    一.插入与更新操作: MySQL中,采用ON DUPLICATE KEY UPDATE语句对不存在的数据进行INSERT插入操作,对已存在的数据进行UPDATE更新操作: 总结: 1.ON DUPLI ...

  4. SQL从一个表查询数据插入/更新到另一个表

    示例一: 从数据库表A中查询出数据插入到数据库表B 从数据库DataBaseA的表TDA中查询出数据插入到数据库DataBaseB的表TDB insert into [DataBaseA].[dbo] ...

  5. mybatis+Oracle 批量插入数据,有数据做更新操作

    <!-- 批量添加 -->     <insert id="batchAdd" parameterType="java.util.List"& ...

  6. 接收新信息,在会话中看不到(thread表数据插入/更新失败)

    分析原因:收到短信,sms表插入信息,触发器会自动更新thread表,更新失败导致一直有一条未读信息数量显示,但在会话列表中却看不到. (偶现,低概率. 解决方法:接收新信息插入后,立即查询threa ...

  7. Java批量插入更新操作

    以前总是说批量插入和更新的效率比非批量的要高,但是一直没有使用过批量处理数据的功能,现在由于项目中需要处理的数据量比较大,所以使用了批量处理的功能,java代码如下: 1.java实现批量插入数据: ...

  8. MySQL笔记(三)之数据插入更新与删除

    INSERT INTO INSERT INTO 语句用于向表格中插入新的行. 语法: INSERT INTO 表 VALUES (值1, 值2,....) # 列数必须和值的个数匹配 INSERT I ...

  9. oracle triggers 实现两个结构相同的表的数据级联更新操作

    首先创建两个结构相同的表 -- Create table create table TABLE_TEMP ( userid NUMBER not null, username NVARCHAR2(50 ...

  10. mysql批量插入更新操作

    //添加关联赠品(确定) public function addGiveGoods($ids,$child,$parent_sku_no){ $license=new LicenseModel(); ...

随机推荐

  1. React中的纯组件

    React中的纯组件 React提供了一种基于浅比较模式来确定是否应该重新渲染组件的类React.PureComponent,通常只需要继承React.PureComponent就可以定义一个纯组件. ...

  2. LVM精简卷(Thinly-Provisioned Logical Volumes)

    可能LVM大家都比较熟悉,那么精简卷又是干什么的呢?相比于普通LVM有什么优势,又会带来哪些新的问题?带着这些我们来一探究竟: 工作原理 在创建Thin"瘦"卷时,预分配一个虚拟的 ...

  3. Error parsing HTTP request header--400 bad request

    问题描述: JSP中通过form post方式请求URL传入json格式参数报错: 信息: Error parsing HTTP request header  Note: further occur ...

  4. windbg 分析 32 位进程的 64 位转储文件

    场景: x86 的项目在 x64 的 windows 机器上运行时出现未响应的情况,使用任务管理器创建该进程的转储文件 因为项目是 32 位的,所以使用 x86 的 windbg 来调试 dmp 文件 ...

  5. crontab采坑总结

    目录 crontab环境变量 脚本缺少执行权限 crontab是Linux平台实现定时任务的服务工具,通常情况下该服务会预装在发行版中,直接使用即可. 关于crontab的详细用法参考:https:/ ...

  6. Redis高级系列详解

    01-Redis系列之-Redis介绍安装配置 02-Redis系列之-架构和高级API的使用 03-Redis系列之-高级用法详解 04-Redis系列之-持久化(RDB,AOF) 05-Redis ...

  7. Windows 实例如何开放端口

    矩池云 Windows 实例相比于 Linux 实例,除了在租用机器的时候自定义端口外,还需要在 Windows防火墙中添加入口规则.接下来将教大家如何设置 Windows 防火墙,启用端口. 租用成 ...

  8. 【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例

    问题描述 很早之前,介绍了在 App Service for Linux中挂载 Storage Account共享文件,当时Windows无法实现这个功能.而现在,App Service For Wi ...

  9. 有了 ETL 数据神器 dbt,表数据秒变 NebulaGraph 中的图数据

    本文搭配同主题分享视频阅读更佳,<多数据源的数据治理实践> 如果你装好某款数据库产品,比如:分布式图数据库 NebulaGrpah,跃跃欲试的第一步是不是就让它干活搞数据呢?好的,现在问题 ...

  10. Windows配置R语言、RStudio开发环境

      本文介绍R语言及其集成开发环境RStudio的下载.安装方法.   R语言是一个属于GNU操作系统的开源软件,在数据统计与分析.可视化等方面具有优秀的表现:而RStudio则是R语言的集成开发环境 ...