MySQL批量插入和唯一索引问题的解决方法
作者:daisy 发布时间:2024-01-23 20:09:23
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://www.linuxidc.com/Linux/2019-04/157911.htm


猜你喜欢
- 设置部分:首先网页登录QQ邮箱设置一些待会儿会用到的参数:首先开启POP3/SMTP和IMAP/SMTP服务,然后生成授权码,然后复制到代码
- 平面设计 常用尺寸 三折页广告 标准尺寸: (A4)210mm x 285mm普通宣传册 标准尺寸: (A4)210mm x 285mm文件
- 验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册、灌水、发垃圾广告等等 。数据集
- 能够为数据库数据提供的最简单的用户界面之一就是窗体,窗体可以一次性呈现出来自同一记录的各个域。本文通过python3+pyqt5改写实现了p
- 1. 正文1.1下载和安装软件本文我会通过miniconda+jupyter lab的形式带大家安装opencv;有很多朋友会问为什么不是a
- 这几天接到一个需求需要吧不同系统的数据库进行同步,需要我做一个中间平台进行连接,瞬间就想到了触发器调用接口然后通过API进行传递再写入另一个
- 上篇文章讲了js中的传值和传址 和 函数的作用域.这章我们来探讨js中的变量,表达式,和运算符 还有一些 js 语句。升级中……1, 表达式
- python编写的语音天气预报本系统主要包括四个函数:1、获取天气数据1、输入要查询天气的城市2、利用urllib模块向中华万年历天气api
- 一、程序导出word文档的方法将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob、Apache PO
- 比如:现需要向学生表中插入新的学生数据。但在插入学生数据的时,需要同时检查老师表里的数据。如果插入学生的老师不在老师表里,则先向老师表中插入
- 先给出结论:要替换的字符数量不多时,可以直接链式replace()方法进行替换,效率非常高;如果要替换的字符数量较多,则推荐在 for 循环
- 运行效果:完整源码:##import libraryfrom tkinter import *import timefrom playsou
- CUDA的线程与块GPU从计算逻辑来讲,可以认为是一个高并行度的计算阵列,我们可以想象成一个二维的像围棋棋盘一样的网格,每一个格子都可以执行
- 如下所示:from ctypes import *import osimport win32con,win32clipboardaStrin
- 本文实例讲述了PHP设计模式之装饰器模式定义与用法。分享给大家供大家参考,具体如下:什么是装饰器模式作为一种结构型模式, 装饰器(Decor
- 本文实例讲述了PHP扩展Swoole实现实时异步任务队列。分享给大家供大家参考,具体如下:假如要发100封邮件,for循环100遍,用户直接
- 您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ?我们先抛开 g
- sort 标准库Sort 标准库提供了对基本数据类型的切片和自定义类型的切片进行排序的函数,常用函数如下表所示:函数描述Ints(x []i
- 我就废话不多说了,直接上代码吧!import numpy as npimport matplotlib.pyplot as pltdef g
- Javascript中的变量同样支持自由类型转换成为适用(或者要求)的内容以便于使用。 弱类型的Javascript不会按照程序员的愿望从实