MySQL + PostgreSQL批量插入更新insertOrUpdate[通俗易懂]

MySQL + PostgreSQL批量插入更新insertOrUpdate[通俗易懂]????周周有福利,周周有惊喜哪吒社区-风火轮计划????Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强)????Java经典面试题大全:10万字208道Java经典面试题总结(附答案)????简介:Java领域优质创作者????、CSDN哪吒公众号作者✌、Java架构师奋斗者????????扫描主页左侧二维码,加入群聊,一起学习、一起进步????欢迎点赞????收藏⭐留言????这里写目录标题一、百度百科1、MySQL2、Pos

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

? 作者简介:CSDN2021博客之星亚军?、新星计划导师✌、博客专家?

? 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

? 关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步

一、百度百科

1、MySQL

MySQL声称自己是最流行的开源数据库。LAMP中的M指的就是MySQL。构建在LAMP上的应用都会使用MySQL,如WordPress、Drupal等大多数php开源程序。MySQL最初是由MySQL AB开发的,然后在2008年以10亿美金的价格卖给了Sun公司,Sun公司又在2010年被Oracle收购。Oracle支持MySQL的多个版本:Standard、Enterprise、Classic、Cluster、Embedded与Community。其中有一些是免费下载的,另外一些则是收费的。其核心代码基于GPL许可,由于MySQL被控制在Oracle,社区担心会对MySQL的开源会有影响,所以开发了一些分支,比如: MariaDB和Percona。

2、PostgreSQL

PostgreSQL标榜自己是世界上最先进的开源数据库。PostgreSQL的一些粉丝说它能与Oracle相媲美,而且没有那么昂贵的价格和傲慢的客服。最初是1985年在加利福尼亚大学伯克利分校开发的,作为Ingres数据库的后继。PostgreSQL是完全由社区驱动的开源项目。它提供了单个完整功能的版本,而不像MySQL那样提供了多个不同的社区版、商业版与企业版。PostgreSQL基于自由的BSD/MIT许可,组织可以使用、复制、修改和重新分发代码,只需要提供一个版权声明即可。

3、PostgreSQL相对于MySQL的优势

(1)不仅仅是关系型数据库,还可以存储:

array,不管是一位数组还是多为数组均支持
json(hStore)和jsonb,相比使用text存储接送要高效很多
(2)支持地理信息处理扩展

(3)可以快速构建REST API

(4)支持R-trees这样可扩展的索引类型,可以更方便地处理一些特殊数据。MySQL 处理树状的设计会很复杂, 而且需要写很多代码, 而 PostgreSQL 可以高效处理树结构。

(5)更好的外部数据源支持

(6)字符串没有长度限制

二、postgres中insertOrUpdate代码实例

1、创建user表

CREATE TABLE public.t_user (
    username varchar(100) NOT NULL,
    age int4 NOT NULL DEFAULT 0,
    "password" varchar(100) NULL,
    deleted int4 NULL,
    created_time timestamp NULL
);
CREATE UNIQUE INDEX t_user_union_name_age_password ON public.t_user USING btree (username, password, age);

2、简单的方式实现

insert
    into
    public.t_user (username , password,age,created_time)
values ('zs', '123', 18,now()), ('ls', '123456', 19,now()),('ww', '123', 20,now()) 
on conflict (username, age,password) do update set username = excluded.username,age = excluded.age,password = excluded.password,created_time = excluded.created_time

3、利用unnest函数实现

insert
    into
    public.t_user (username , password,age,created_time)
values (unnest(array['zs', 'ls', 'ww']), unnest(array['123', '123', '123456']),unnest(array[18, 19, 20]), unnest(array[now(), now(), now()])) 
on conflict (username, age,password) do update set username = excluded.username,age = excluded.age,password = excluded.password,created_time = excluded.created_time

4、如果数据已存在,就就什么也不做

insert
    into
    public.t_user (username , password,age,created_time)
values ('zs', '123', 18,now()), ('ls', '123456', 19,now()),('ww', '123', 20,now()) 
on conflict (username, age,password) do nothing

三、相关重点函数简介

1、unnest(anyarray)

unnest函数将输入的数组转换成一个表,这个表的每一列都代表相应的一个数组中的元素。
如果unnest与其他字段一起出现在select中,就相当于其他字段进行了一次join。

主要用于完成行转列的场景。

select '张三' as name, unnest(Array['语文','数学','英语']) as course;
 name | course
------+--------
 张三 | 语文
 张三 | 数学
 张三 | 英语
(3 rows)

INSERT ON CONFLICT实现PostgreSQL插入更新特性。

EXCLUDED虚拟表,其包含我们要更新的记录

四、userMapper.xml写法

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.guor.dao.UserMapper">
 
    <!-- 批量插入 -->
    <insert id="batchInsert" parameterType="java.util.HashMap">
         <include refid="batchInsertSql"></include>
    </insert>
 
    <sql id="batchInsertSql">
        INSERT INTO ${map.tableInfo.schemaName}.${map.tableInfo.tableName}
        (
        "table_id",
        "file_name",
        "create_time",
        <foreach collection="map.list.get(0)" index="key" item="value"
                 separator=",">
            "${key}"
        </foreach>
        )
        VALUES
        <foreach collection="map.list" item="list" separator=",">
            (
            ${map.tableInfo.tableId},
            #{map.tableInfo.fileName},
            now(),
            <foreach collection="list" index="key" item="value"
                     separator=",">
                <choose>
                    <when test="map.varcharList.contains(key)">
                        #{value}
                    </when>
                    <when test="map.dateList.contains(key)">
                        TO_TIMESTAMP(#{value},'yyyy-MM-dd hh24:mi:ss')
                    </when>
                    <otherwise>
                        ${
  
  value}
                    </otherwise>
                </choose>
            </foreach>
            )
        </foreach>
    </sql>
 
    <!-- 批量插入更新 -->
    <insert id="batchInsertOrUpdate" parameterType="java.util.HashMap">
        <include refid="batchInsertSql"></include>
        on conflict (
        file_name, table_id
        <if test="map.tableInfo.flag">
            , "id_number"
        </if>
        ) do update
        set
        "table_id" = excluded."table_id",
        "file_name" = excluded."file_name",
        "create_time" = excluded."create_time",
        <foreach collection="map.list.get(0)" index="key" separator=",">
            "${key}" = excluded."${key}"
        </foreach>
    </insert>
</mapper>

五、MySQL中insertOrUpdate代码实例

1、建表语句

CREATE TABLE `t_user`  (
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `age` int(0) NULL DEFAULT NULL,
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `create_time` datetime(0) NULL DEFAULT NULL,
  `update_time` datetime(0) NULL DEFAULT NULL,
  `version` int(0) NOT NULL,
  UNIQUE INDEX `user_union_index`(`username`, `password`, `age`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

2、普通方式

INSERT INTO t_user
(username,password,age,create_time) 
VALUES('张三' ,'123456',18,NOW())
ON DUPLICATE KEY UPDATE 
username='张三',
password='123456',
create_time=now()

3、ON DUPLICATE KEY UPDATE

insert into on duplicate key update表示插入更新数据,当记录中有PrimaryKey,或者unique索引的话,如果数据库已经存在数据,则用新数据更新(update),如果没有数据效果则和insert into一样。

INSERT INTO t_user 
(username,password,age,create_time,update_time,version)
VALUES( 'zs' ,'123',10,now(),now(),1) 
,( 'ls' ,'123456',20,now(),now(),1) 
,( 'ww' ,'123',30,now(),now(),1) 
ON DUPLICATE KEY UPDATE 
username= VALUES(username)
,password=VALUES(password)
,age=VALUES(age)
,update_time=VALUES(update_time)
,version = version + 1

4、REPLACE INTO

replace into表示插入替换数据,当记录中有PrimaryKey,或者unique索引的话,如果数据库已经存在数据,则用新数据替换(先delete再insert),如果没有数据效果则和insert into一样。

REPLACE INTO t_user 
(username,password,age,create_time,update_time,version) 
VALUES 
( 'zs' ,'123',10,now(),now(),1) 

5、INSERT IGNORE INTO

insert ignore into表示尽可能的忽略冲突,暴力插入。

INSERT IGNORE INTO t_user 
(username,password,age,create_time,update_time,version) 
VALUES 
( 'zs' ,'123',10,now(),now(),1) ,
( '哪吒' ,'123',30,now(),now(),2) 

6、小结

insert into values 或 insert into select批量插入时,都满足事务的原子性与一致性,但要注意insert into select的加锁问题。
replace into与insert into on duplicate key update都可以实现批量的插入更新,具体是更新还是插入取决与记录中的pk或uk数据在表中是否存在。如果存在,前者是先delete后insert,后者是update。
insert ignore into会忽略很多数据上的冲突与约束,平时很少使用。

六、《MySQL技术大全:开发、优化与运维实战》图书推荐

【内容简介】

《MySQL技术大全:开发、优化与运维实战(视频教学版)》结合大量示例和实战案例,全面、系统、深入地介绍了MySQL数据库技术,重点阐述了MySQL开发、优化和运维过程中的各个技术点。《MySQL技术大全:开发、优化与运维实战(视频教学版)》对学习MySQL技术有较高的参考价值,尤其是环境搭建、优化、维护和架构等内容可直接用于实际工作中。

《MySQL技术大全:开发、优化与运维实战(视频教学版)》共33章,分为6篇。第1篇“MySQL基础”,介绍数据库的定义、发展,以及数据库技术和MySQL数据库的三大范式与存储引擎。第2篇“环境搭建”,介绍VMware虚拟机以及Windows、Mac OS X和CentOS操作系统的安装,并介绍如何在三大操作系统上安装和配置MySQL。第3篇“MySQL开发”,介绍MySQL中的数据库操作、数据表操作、数据类型、运算符、函数、数据变更、数据查询、索引、视图、存储过程、触发器、分区、公用表表达式和生成列等。第4篇“MySQL优化”,介绍MySQL中的查询优化、索引优化、SQL语句优化、数据库优化、服务器优化、应用程序优化及其他优化技术。第5篇“MySQL运维”,介绍MySQL中各种命令行工具的使用,以及各种日志的开启、查看、删除与关闭,并介绍数据的备份与恢复及MySQL中的账户管理。第6篇“MySQL架构”,介绍MySQL中的复制、读写分离环境搭建,以及如何实现MySQL的高可用架构等。

在这里插入图片描述
当当网链接:MySQL技术大全:开发、优化与运维实战

【赚取积分方式】哪吒社区内发帖、点赞、评论都可赢取积分!

? 作者简介:CSDN2021博客之星亚军?、新星计划导师✌、博客专家?

? 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

? 关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步

在这里插入图片描述


关注公众号,回复1024,获取Java学习路线思维导图、加入万粉计划交流群

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/164617.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 2016年四川省TI杯电子设计竞赛B题

    2016年四川省TI杯电子设计竞赛B题B题:自动循迹小车1.任务设计制作一个自动循迹小车。小车采用一片TI公司LDC1314或LDC1000电感数字转换器作为循迹传感器,在规定的平面跑道自动按顺时针方向循迹前进。跑道的标识为一根直径0.6~0.9mm的细铁丝,按照图1的示意尺寸,用透明胶带将其贴在跑道上。图中所有圆弧的半径均为为20cm±2cm。图1跑道示意图2.要求(1)在图1小车所在的直线区任意指定一

  • administrator改名字_win10改了用户名无法登录

    administrator改名字_win10改了用户名无法登录网友求助:xp用administrator_XP系统修改administrator的用户名_xpadministrator问题不想添加多一个用户的办法?????????????????最佳答案说实话没有看懂题主的要求。我只能从你题面对描述,即将高级管理员帐户“Administrator”改变成其他名字来解答。要想将WindowsXP中要将默认的系统用户名改变成其他名称是可以实现的,但是需要调用“组…

    2022年10月14日
  • 博客汇总-2016级本科东北师范大学软件工程「建议收藏」

    博客汇总-2016级本科东北师范大学软件工程「建议收藏」一、要做的请各位同学在博客园"http://www.cnblogs.com/"创建自己的博客园账号,然后在这篇你正在浏览的博客的评论区按照指定的格式留下你的姓名、博客地址。

  • dubbox 的各种管理和监管[转]

    dubbox 的各种管理和监管[转]

  • oracle手动创建数据库_oracle怎么建库

    oracle手动创建数据库_oracle怎么建库ORACLE手动建库ORACLE10GR2手动建库大致分为以下几个步骤编辑.bash_profile文件,设置环境变量创建所需目录结构创建初始化参数文件执行建库脚本下面以创建test数据库为例1、编辑.bash_profile文件,添加ORACLE_SID环境变量在.bash_profile文件中指定ORACLE_SIDexportORACLE_SID=test[oracle@targets…

    2022年10月27日
  • Android 框架揭秘 –读书笔记[通俗易懂]

    Android 框架揭秘 –读书笔记[通俗易懂]Android框架揭秘InsiedtheAndroidFramework

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号