mysql批量插入数据时遇到的问题

本文详细解析了在使用MySQL进行数据批量插入时遇到的关键字字段问题及解决方案,同时分享了在MyBatis框架下实现批量更新时的常见错误与正确配置方法。

一、数据库mysql  批量插入 时遇到的问题:
     数据表的字段  一定不要是关键字(key,value等),否则你执行sql的时候一直报错,告诉你糟糕的sql语法,错误靠近###等  
     但是出于常理,我们肯定不会去想    是数据表的字段名出了问题,而是想sql语法,或者是值传的有问题。
     但最后我还是发现了关键字的问题,因为我用排除法排除所有结果,剩下的那个就是真相。
     因为首先我们确保sql的语法是正确的,那么错误就在数据上,首先将数据表字段的数据分为几类,比如字符串,int,和时间 ,然后逐个排除。
     1、先将sql中只留字符串类型,然后执行,看是否报错,有错说明在这几个字符串中某些出了问题,在细分找;没问题的话就下一步
     2、sql的插入条件只留int类型,然后执行,。。。。
     3、sql 中只留时间data类型,
     最后你就会发现,关键字的列会报错,然后把名字改成普通的,就运行通过了!

2、这是修改后我批量查询的sql:

<!-- 批量保存数据 -->
    <insert id="saveEnvConfig" parameterType="arrayList">  
            <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
               SELECT @@IDENTITY AS id
          </selectKey>
        insert into envconfig(version,createTime,editTime,createUser,editUser,resourceID,envResourceID,envKey,envValue)values   
        <foreach collection="list" item="item"  index="index" separator=",">  
           (0,#{item.createTime},#{item.editTime},#{item.createUser},#{item.editUser},#{item.resourceID},#{item.envResourceID},#{item.envKey},#{item.envValue})   
        </foreach>  
    </insert>  

3、批量查询出错了,不要惊慌,先试试插入单条数据,如果单条插入数据也出错,那么原因很有可能就是数据的问题。

之后就是排除法一一知道找错错误的那一列。

4、报错的sql:

 insert into envconfig(version,createTime,editTime,createUser,editUser,resourceID,envResourceID,key,value) values
             (0,#{createTime},#{editTime},#{createUser},#{editUser},#{resourceID},#{envResourceID},#{key},#{value})  

5、报错内容:

最后附上,调错一定要细心,粗心大意会浪费你很多时间,写到这里,着重感谢刘**对我热心的帮助。希望以后编程路上能永远充满激情,克服粗心,着急,手忙脚乱的坏习惯。

特别注意的情况:(批量更新不起作用)

二、mybatis实现批量更新,一直报错,说我的sql语句不对,然后我仔细检查了语句没问题,还是执行不了,运行报错。

原来,在连接数据库的url中要加入 ?allowMultiQueries=true 这段,而且要放在第一行。

        url: jdbc:mysql://localhost:3306/crm?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
        username: root
        password: root

### MySQL 批量插入数据处理主键冲突的方法 当执行批量插入操作,可能会遇到主键冲突的问题。为了有效解决这一问题并确保高效的数据插入过程,可以采用多种策略。 #### 使用 `INSERT ... ON DUPLICATE KEY UPDATE` 语句 此语法允许在发生重复键错误更新现有记录而不是失败。这可以通过指定列名及其新值来实现[^3]: ```sql INSERT INTO table_name (id, column1, column2) VALUES (?, ?, ?), (?, ?, ?), ... ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2); ``` 这种方法适用于希望保留旧记录的同仅更新某些字段的情况。 #### 利用临与 `REPLACE INTO` 创建一个临用于存储待插入的新数据,之后通过 `REPLACE INTO` 将这些数据迁移到目标中。这种方式会删除已存在的行然后再插入新的行,因此可能导致自增 ID 的变化: ```sql CREATE TEMPORARY TABLE temp_table AS SELECT * FROM target_table WHERE FALSE; LOAD DATA LOCAL INFILE 'data.csv' INTO TABLE temp_table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'; REPLACE INTO target_table SELECT * FROM temp_table; DROP TEMPORARY TABLE IF EXISTS temp_table; ``` 需要注意的是,在高并发环境下使用 `REPLACE INTO` 可能会引起性能下降以及潜在的数据丢失风险。 #### 应用唯一索引约束下的忽略插入 (`IGNORE`) 对于那些不需要覆盖已有数据的情形下,可以在 `INSERT` 前加上关键字 `IGNORE` 来跳过已经存在相同主键的记录插入动作: ```sql INSERT IGNORE INTO table_name (id, col1, col2,...) VALUES (...),(...),(...); ``` 这种做法简单直接,但在实际应用过程中需谨慎评估业务逻辑需求。 #### 自定义ID生成器配合分布式环境 考虑到大规模分布式系统的特殊性,建议引入全局唯一的ID生成机制,比如雪花算法(Snowflake Algorithm),从而从根本上杜绝因本地自增长而导致的主键碰撞现象[^4]。 ```java // Java 实现 SnowFlake 算法获取唯一 ID 示例 public class IdGenerator { private final long workerIdBits = 5L; // 工作机器位数 private final long datacenterIdBits = 5L;// 数据中心位数 public synchronized long nextId() { // 构建唯一 ID... return id; } } ``` 上述几种方式各有优劣,具体选择取决于应用场景的具体情况和个人偏好等因素综合考量的结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值