MySql批量插入与唯一索引问题

MySQL批量插入问题

在开发项目时,因为有一些旧系统的基础数据需要提前导入,所以我在导入时做了批量导入操作 ,但是因为MySQL中的一次可接受的SQL语句大小受限制所以我每次批量虽然只有500条,但依然无法插入,这个时候代码报错如下:

nested exception is com.mysql.jdbc.PacketTooBigException: Packet for query is too large (5677854 > 1048576).

You can change this value on the server by setting the max_allowed_packet‘ variable.

根据报错我们很快就可以知道,是SQL语句数据包太大导致,我们可以设置MySQL服务器参数max_allowed_packet来解决这个问题。

解决办法

1.添加【mysqld】下max_allowed_packet参数,设置的尽量大一些。

#找到my.cnf文件
#whereis my.cnf
#vim my.cnf
----------------------------
[mysqld]
max_connections =3000
max_allowed_packet=1024M

#保存后重启mysql服务,即可生效
#service mysqld restart

2.临时设置max_allowed_packet,通过语句设置

 myslq>set global max_allowed_packet = 1024*1024*1024
 该种方式重启后就max_allowed_packet失效了

默认情况下Mysql参数max_allowed_packet值是1M.

MySQL索引不区分大小写问题

当在MySQL数据库中,创建索引默认是不区分大小写的,比如说如下语句:

CREATE TABLE `location` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rc` varchar(2) DEFAULT NULL COMMENT ‘R/C‘,
  `location_code` varchar(4) DEFAULT NULL COMMENT ‘地点编码‘,
  `location_name` varchar(30) DEFAULT NULL COMMENT ‘地点名称‘,
  `zip_code` varchar(6) DEFAULT NULL COMMENT ‘邮编‘,
  `address` varchar(50) DEFAULT NULL COMMENT ‘地址‘,
  `link_man` varchar(15) DEFAULT NULL COMMENT ‘联系人‘,
  `link_phone` varchar(30) DEFAULT NULL COMMENT ‘联系电话‘,
  `fax` varchar(30) DEFAULT NULL COMMENT ‘传真‘,
  `can_accept_car_time` varchar(40) DEFAULT NULL COMMENT ‘可接车时间‘,
  `type` varchar(1) DEFAULT NULL COMMENT ‘分类‘,
  `maintenance_type` varchar(1) DEFAULT NULL COMMENT ‘维护类型‘,
  `brand` varchar(4) DEFAULT NULL COMMENT ‘品牌‘,
  `reservation` varchar(40) DEFAULT NULL COMMENT ‘预留‘,
   `enable` int(1) DEFAULT ‘1‘,
  `msg_code` varchar(64) NOT NULL COMMENT ‘消息编码‘,
  `receive_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘接收日期‘,
  `create_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建日期‘,
  `modified_on` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘修改日期‘,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_msg_code` (`msg_code`) USING BTREE,
  UNIQUE KEY `unique_location_code` (`location_code`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=16325 DEFAULT CHARSET=utf8 COMMENT=‘地址表‘;

但当我插入地址编码分别为H12C与h12C时,就报错了,抛出异常:Duplicate entry ‘H12C‘ for key ‘normal_localtion_code‘,这里则说明不区分大小写,所以这个地方需要解决这个问题。

解决方法

1.设置字段为Binary,那么索引就可以区分大小写了。

CREATE TABLE `location` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rc` char(2) DEFAULT NULL COMMENT ‘R/C‘,
  `location_code` varchar(4) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘地点编码‘,
  `location_name` varchar(26) DEFAULT NULL COMMENT ‘地点名称‘,
  `zip_code` varchar(6) DEFAULT NULL COMMENT ‘邮编‘,
  `address` varchar(50) DEFAULT NULL COMMENT ‘地址‘,
  `link_man` varchar(16) DEFAULT NULL COMMENT ‘联系人‘,
  `link_phone` varchar(30) DEFAULT NULL COMMENT ‘联系电话‘,
  `fax` varchar(30) DEFAULT NULL COMMENT ‘传真‘,
  `can_accept_car_time` varchar(40) DEFAULT NULL COMMENT ‘可接车时间‘,
  `type` varchar(1) DEFAULT NULL COMMENT ‘分类‘,
  `maintenance_type` varchar(1) DEFAULT NULL COMMENT ‘维护类型‘,
  `brand` varchar(4) DEFAULT NULL COMMENT ‘品牌‘,
  `reservation` varchar(40) DEFAULT NULL COMMENT ‘预留‘,
  `enable` int(1) DEFAULT ‘1‘,
  `msg_code` varchar(64) NOT NULL COMMENT ‘消息编码‘,
  `receive_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘接收日期‘,
  `create_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建日期‘,
  `modified_on` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘修改日期‘,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_msg_code` (`msg_code`) USING BTREE,
  UNIQUE KEY `unique_location_code` (`location_code`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4092 DEFAULT CHARSET=utf8 COMMENT=‘地点表‘;

// 修改原表字典属性:

ALTER TABLE `location`
CHANGE COLUMN `location_code` `location_code` VARCHAR(4) CHARACTER SET ‘utf8‘ BINARY NOT NULL DEFAULT ‘‘ ;

上面方法就解决了。

查询时不区分大小写问题

解决方法

1.查询语句加binary

2.与索引解决方案一致,设置字段属性为binary即可。

原文地址:https://blog.51cto.com/4837471/2372755

时间: 2024-10-07 20:05:40

MySql批量插入与唯一索引问题的相关文章

mysql批量插入数据

review代码发现,同事mysql批量插入数据的实现方法是,用for循环遍历,将列表每个数据单次插入.相当于批量插入N条数据,进行了n次的数据库连接和插入操作. 底层有批量插入的方法,但是会有问题,所以已经停用,看下面实现是,取到一个数据库连接,来处理后面所有的插入操作.若这个列表ops所有的sql语句执行的数据库都是同一个的话,就没什么问题,若里面存在散库的情况,只要跟第一个不在同一个库的,都会执行失败. public void insertBatch(List<OpBatchUpdate>

mysql 批量插入

对于批量插入: 1.在建立唯一索引的情况下,,从前往后,如果遇到索引重复错误 则停止插入(前面的插入成功),错误后面的即使正确也不会插入 方法1:insert igore 后 解决此问题 (ignore是指如果索引重复则不插入,这样即使记录中索引字段以外的值更新了也无法更新) 方法2:用replace into 代替(弊端:记录id会变化) 2.对于sql语句本身错误的,都不会插入

mysql 批量插入数据 优化

对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. 经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考. 1. 一条SQL语句插入多条数据. 常用的插入语句如: MySQL 1 2 3 4 INSERT INTO `insert_table` (`datetime`, `uid`, `content

MySQL批量插入数据的几种方法

最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别 别的先不说,先上一段代码与君共享 方法一: package com.bigdata; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; public class TestBigData { /**

MYSQL批量插入数据库实现语句性能分析

假定我们的表结构如下 代码如下   CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( 50 ) NOT NULL, value VARCHAR( 50 ) NOT NULL, other_value VARCHAR( 50 ) NOT NULL ) 通常情况下单条插入的sql语句我们会这么写: 代码如下   INSERT INTO example (example_id, name, value, other_value)

Mysql批量插入返回Id错乱(原因分析)

在项目中经常会有如下场景: 往数据库中批量插入一批数据后,需要知道哪些插入成功,哪些插入失败了. 这时候往往会有两种思路,一个是在插入之前判断相同的记录是否存在,过滤掉重复的数据:另外一种就是边插入边判断,动态过滤. 第一种方式对于数据量过大的情况并不适用,为了采用第二种方法,我们使用了"Mybatis批量插入返回自增主键"的方式进行处理. mysql插入操作后返回主键是jdbc的功能,用到的方法是getGeneratedKeys()方法,使用此方法获取自增数据,性能良好,只需要一次交

mybatis+mysql批量插入和批量更新

一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo,oo,oo) mybatis中mapper.xml的代码如下: <!-- 批量插入数据 --> <insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true"> <sel

Mybatis+mysql批量插入性能分析测试

前言 今天在网上看到一篇文章(后文中的文章指的就是它) https://www.jianshu.com/p/cce617be9f9e 发现了一种有关于mybatis批量插入的新方法,而且看了文章发现我原来的方法好像有点问题,但是由于文章中使用的环境是sqlserver而我经常使用的是mysql所以还是需要亲自来试试. 环境说明 项目使用springboot mybatis 数据库mysql5.7 使用本地mysql所以网络可以忽略不计 插入对象完全相同,只有id自增 表结构如下: CREATE

MySQL批量插入的分析以及注意事项

目录 1.背景 2.两种方式对比 2.1.一次插入一条数据 2.2.一次插入多条数据 3.拓展一下 4.Other 1.背景 我们在工作中基本都会碰到批量插入数据到DB的情况,这个时候我们就需要根据不同的情况选择不同的策略. 只要了解sql,就应该知道,向table中插入数据的命令,至少有insert和replace这两种,使用哪一种命令,和自己的业务有关: 本文就针对insert进行批量插入进行阐述,然后根据自身经历分享几个注意事项. 2.两种方式的对比 即使是insert命令,他也是有多种插