热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库技术:实操MySQL+PostgreSQL批量插入更新insertOrUpdate

目录1、mysql2、postgresql3、postgresql相对于mysql的优势二、postgres中insertorupdate代码实例四、usermapper.xml写
目录
    • 1、mysql
    • 2、postgresql
    • 3、postgresql相对于mysql的优势
  • 二、postgres中insertorupdate代码实例
  • 四、usermapper.xml写法
    • 五、mysql中insertorupdate代码实例
      • 3、on duplicate key update
      • 4、replace into
      • 5、insert ignore into

    一、百度百科

    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、如果数据已存在,就就什么也不做

    三、相关重点函数简介

    1、unnest(anyarray)

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

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

    insert on conflict实现postgresql插入更新特性。

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

    四、usermapper.xml写法

                                                             insert into ${map.tableinfo.schemaname}.${map.tableinfo.tablename}          (          "table_id",          "file_name",          "create_time",                        "${key}"                    )          values                        (              ${map.tableinfo.tableid},              #{map.tableinfo.filename},              now(),                                                                                #{value}                                                                      to_timestamp(#{value},'yyyy-mm-dd hh24:mi:ss')                                                                      ${value}                                                                    )                                                   on conflict (          file_name, table_id                        , "id_number"                    ) do update          set          "table_id" = excluded."table_id",          "file_name" = excluded."file_name",          "create_time" = excluded."create_time",                        "${key}" = excluded."${key}"                  

    五、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 + postgresql批量插入更新insertorupdate的文章就介绍到这了,更多相关mysql + postgresql批量插入更新insertorupdate内容请搜索<编程笔记>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<编程笔记>!

    需要了解更多数据库技术:实操MySQL+PostgreSQL批量插入更新insertOrUpdate,都可以关注数据库技术分享栏目—编程笔记


    推荐阅读
    • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
    • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
    • 高质量SQL书写的30条建议
      本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
    • 如何查询zone下的表的信息
      本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
    • SpringMVC接收请求参数的方式总结
      本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
    • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
    • 云原生边缘计算之KubeEdge简介及功能特点
      本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
    • 知识图谱——机器大脑中的知识库
      本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
    • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
    • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
    • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
    • 如何提高PHP编程技能及推荐高级教程
      本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
    • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
    • SpringBoot整合SpringSecurity+JWT实现单点登录
      SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
    • 数据库进入全新时代,腾讯云发布五大数据库提前布局
      8月28日,腾讯云数据库在京正式启动战略升级,宣布未来将聚焦云原生、自治、超融合三大战略方向,以用户为中心,联接未来。并在现场面向全球用户同步发布五大战略级新品,包括数据库智能管家 ... [详细]
    author-avatar
    多米音乐_34281398
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有