热门标签 | 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,都可以关注数据库技术分享栏目—编程笔记


    推荐阅读
    • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
    • 使用EF Core在.Net Core控制台应用中操作SQLite数据库
      本文介绍如何利用Visual Studio 2019和Windows 10环境,通过Entity Framework Core(EF Core)实现对SQLite数据库的读写操作。项目源代码可从百度网盘下载。 ... [详细]
    • 本文探讨了SQLAlchemy ORM框架中如何利用外键和关系(relationship)来建立表间联系,简化复杂的查询操作。通过示例代码详细解释了relationship的定义、使用方法及其与外键的相互作用。 ... [详细]
    • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
    • 本文介绍了多种将多行数据合并为单行的方法,包括使用动态SQL、函数、CTE等技术,适用于不同的SQL Server版本。 ... [详细]
    • Navicat Premium中MySQL用户管理:创建新用户及高级设置
      本文作为Navicat Premium用户管理系列的第二部分,主要介绍如何创建新的MySQL用户,包括设置基本账户信息、密码策略、账户限制以及SSL配置等。 ... [详细]
    • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
    • 深入浅出:Hadoop架构详解
      Hadoop作为大数据处理的核心技术,包含了一系列组件如HDFS(分布式文件系统)、YARN(资源管理框架)和MapReduce(并行计算模型)。本文将通过实例解析Hadoop的工作原理及其优势。 ... [详细]
    • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
    • J2EE平台集成了多种服务、API和协议,旨在支持基于Web的多层应用开发。本文将详细介绍J2EE平台中的13项关键技术规范,涵盖从数据库连接到事务处理等多个方面。 ... [详细]
    • 设计模式系列-原型模式
      一、上篇回顾上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每个组成部分的详细创建步骤可以是动态的变化的,但 ... [详细]
    • 抽象工厂模式 c++
      抽象工厂模式包含如下角色:AbstractFactory:抽象工厂ConcreteFactory:具体工厂AbstractProduct:抽象产品Product:具体产品https ... [详细]
    • 本文详细介绍了在Mac操作系统中使用Python连接MySQL数据库的方法,包括常见的错误处理及解决方案。 ... [详细]
    • 构建高性能Feed流系统的设计指南
      随着移动互联网的发展,Feed流系统成为了众多社交应用的核心组成部分。本文将深入探讨如何设计一个高效、稳定的Feed流系统,涵盖从基础架构到高级特性的各个方面。 ... [详细]
    • 对于初次购买阿里云服务器的新手用户来说,如何高效地利用服务器资源并成功部署网站是一个重要的课题。本文将详细指导您完成从购买服务器到网站上线的六个关键步骤。 ... [详细]
    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社区 版权所有