KingbaseES 数据插入更新操作
数据库使用过程中,经常会遇到一种场景:业务系统对数据进行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 数据插入更新操作的更多相关文章
- Sql Server数据库使用触发器和sqlbulkcopy大批量数据插入更新
需要了解的知识 1.触发器 2.sqlbulkcopy 我的用途 开发数据库同步的工具,需要大批量数据插入和数据更新. 方式 使用SqlBulkCopy类对数据进行数据批量复制,将需要同步数据的表新建 ...
- day38 mycql 初识概念,库(增删改查),表(增删改)以及表字段(增删改查),插入更新操作
在Navicat中把已经生成的表逆向成模型 数据库上,右键-逆向数据库到模型 ego笔记: 增删改查 文件夹(库) 增 create database day43 charset utf8; 改 al ...
- 11、ON DUPLICATE KEY UPDATE实现插入更新操作
一.插入与更新操作: MySQL中,采用ON DUPLICATE KEY UPDATE语句对不存在的数据进行INSERT插入操作,对已存在的数据进行UPDATE更新操作: 总结: 1.ON DUPLI ...
- SQL从一个表查询数据插入/更新到另一个表
示例一: 从数据库表A中查询出数据插入到数据库表B 从数据库DataBaseA的表TDA中查询出数据插入到数据库DataBaseB的表TDB insert into [DataBaseA].[dbo] ...
- mybatis+Oracle 批量插入数据,有数据做更新操作
<!-- 批量添加 --> <insert id="batchAdd" parameterType="java.util.List"& ...
- 接收新信息,在会话中看不到(thread表数据插入/更新失败)
分析原因:收到短信,sms表插入信息,触发器会自动更新thread表,更新失败导致一直有一条未读信息数量显示,但在会话列表中却看不到. (偶现,低概率. 解决方法:接收新信息插入后,立即查询threa ...
- Java批量插入更新操作
以前总是说批量插入和更新的效率比非批量的要高,但是一直没有使用过批量处理数据的功能,现在由于项目中需要处理的数据量比较大,所以使用了批量处理的功能,java代码如下: 1.java实现批量插入数据: ...
- MySQL笔记(三)之数据插入更新与删除
INSERT INTO INSERT INTO 语句用于向表格中插入新的行. 语法: INSERT INTO 表 VALUES (值1, 值2,....) # 列数必须和值的个数匹配 INSERT I ...
- oracle triggers 实现两个结构相同的表的数据级联更新操作
首先创建两个结构相同的表 -- Create table create table TABLE_TEMP ( userid NUMBER not null, username NVARCHAR2(50 ...
- mysql批量插入更新操作
//添加关联赠品(确定) public function addGiveGoods($ids,$child,$parent_sku_no){ $license=new LicenseModel(); ...
随机推荐
- form表单如何实现ajax提交
最近在开发一个游戏网关的后台管理系统,总结了下中间碰到的一些问题. 之一就是:form表单如何实现ajax提交? 问题:在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转, ...
- Java的SPI机制实践
Java SPI机制概述 先给出结论:"Java的SPI是一种服务发现机制,用于约定接口和动态发现实现类,体现了分层解耦的思想". Java的SPI机制常用于框架扩展或组件替换,最 ...
- Redis搭建Sentinel实验环境
环境准备 在物理机上启动3台虚拟机,IP地址分别为:192.168.56.4,192.168.56.5,192.168.56.6. 1.确保3台虚拟机的网络是相互联通的. 2.确保已经在3台虚拟机上安 ...
- Acrobat 教程
https://helpx.adobe.com/cn/acrobat/using/pdf-form-field-properties.html
- Django多方式登录认证
多方式认证原理 我们平常使用的Django登录认证是django.contrib.auth.authenticate 点进去源码,我们会看到这个函数,真正的认证类是它里面的那个 继续点进去源码,会看到 ...
- Java链接Mysql数据库整理,尽管很简单,但还是分享出来,希望对那些初级朋友有所帮助!!!
Java MySQL 连接 Java MySQL 连接 本章节我们为大家介绍 Java 如何使用 使用 JDBC 连接 MySQL 数据库. Java 连接 MySQL 需要驱动包,最新版下载地址为: ...
- 【Azure Key Vault】是否有直接方法将Azure Key Vault中的机密名称/机密值到处成文件呢?
问题描述 是否有直接方法将Azure Key Vault中的机密名称/机密值导出,保存为一个文件呢? 问题解答 Azure Key Vault 没有直接提供Secret 导出文件(如xlsx格式)的方 ...
- 【Azure 存储服务】Azure Storage Account 下的 Table 查询的性能调优
问题描述 Azure Storage Account 下的 Table 查询的性能调优? 问题解答 因为Azure Storage Table服务(表服务) 与常规的关系型数据库不一样(例如:MySQ ...
- 代码随想录算法训练营第七天| LeetCode 454.四数相加II 15. 三数之和 18. 四数之和
454.四数相加II 卡哥建议:本题是使用map巧妙解决的问题,好好体会一下 哈希法如何提高程序执行效率,降低时间复杂度,当然使用哈希法会提高空间复杂度,但一般来说我们都是舍空间换时间, 工业开发也是 ...
- 探索浏览器录屏Web API 接口的应用前景与限制
一.浏览器录屏Web API 接口的优点: 简化录屏流程:浏览器录屏Web API 接口可以直接在网页中调用,无需安装额外的插件或软件,简化了录屏的流程. 实时录制与传输:Web API 接口可以实时 ...