mysql写入数据,发生字段粘连问题

问题描述

我尽量叙事的清楚点吧,可能稍微啰嗦点。报错内容让我很头疼,我都开始怀疑mybatits 3.0.2 和mysql 5.1是不是本身就有bug了。请大神们稍事略过下面的代码,然后我再叙述项目使用到了spring 3  + mybatits 3.0.2 + mysql 5.1在存储历史记录是报错。偶尔报错,感觉应该是万分之几的概率吧。Caused by: org.springframework.dao.DuplicateKeyException: SqlSession operation; SQL []; Duplicate entry '5879889-35399' for key 'user_id'; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '5879889-35399' for key 'user_id'at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:241)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)at org.mybatis.spring.SqlSessionTemplate.wrapException(SqlSessionTemplate.java:364)at org.mybatis.spring.SqlSessionTemplate$7$1.doInSqlSession(SqlSessionTemplate.java:344)at org.mybatis.spring.SqlSessionTemplate.execute(SqlSessionTemplate.java:173)at org.mybatis.spring.SqlSessionTemplate.execute(SqlSessionTemplate.java:155)at org.mybatis.spring.SqlSessionTemplate$7.invoke(SqlSessionTemplate.java:339)at $Proxy59.addFavorite(Unknown Source)at -------------------------------------.addFavorite(---------.java:104)at -------------------------------------$$FastClassByCGLIB$$bf29fae7.invoke(<generated>)at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:692)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)at ------------------------------------$$EnhancerByCGLIB$$1aaa1136.addFavorite(<generated>)at-------------------------------------.addFavorite(--------.java:277)... 32 moreCaused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '58179889-353994' for key 'user_id'at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)at java.lang.reflect.Constructor.newInstance(Constructor.java:513)at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)at com.mysql.jdbc.Util.getInstance(Util.java:386)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1039)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362)at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.execute(NewProxyPreparedStatement.java:989)at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:22)at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:51)at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:29)at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:73)at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:43)at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:102)at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:91)at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:54)at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:35)at $Proxy59.addFavorite(Unknown Source)at sun.reflect.GeneratedMethodAccessor926.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at org.mybatis.spring.SqlSessionTemplate$7$1.doInSqlSession(SqlSessionTemplate.java:342)... 48 more    上面一堆横杆是我替换了我项目的路径或者类名,    异常中得Duplicate entry '5879889-35399' for key 'user_id'我解释一下    5859889是用户id,35399是书籍id,我再写sql的时候,明明是写对对应的字段的。但是在写入数据库的时候就报错了。    sql如下  <insert id="addFavorite" useGeneratedKeys="true" keyProperty="id" > INSERT INTO favorites (<include refid="favorite.columns" /> <![CDATA[ ) VALUES ( #{id} , #{userId} , #{bookId} , NOW() ) ]]> </insert>   业务代码如下  favorite = new Favorite();favorite.setBookId(bookInfo.getId());favorite.setUserId(user.getId());FavoriteFacade.addFavorite(favorite);// 加入收藏    对于favorite的bookId和userId我都设置的是Integer类型。     不知道为什么,两个字段的内容,再写入数据库的时候,就写在了一块。中间的 - ,是咋回事啊,哪里冒出来的啊????数据库中user_id是int类型。    项目跑了许久了。但是时不时就报着个错误。我感觉我的代码,写的没问题。所以就开始怀疑mybatits 3.0.2 和mysql 5.1是不是本身就有bug了。    大神们,给点建议吧~~~

解决方案

Duplicate entry '5879889-35399' for key 'user_id'应该就是主键重复的问题吧你的userId 和 bookId 是不是联合主键
解决方案二:
很明显呀 索引 user_id(unique) 重复 你的表中有已经存在 user_id(5879889) bookid(35399)的数据了应该在插入数据前检查数据是否已经存在
解决方案三:
你可以在数据源上封装一层SQL日志框架,先看看MYBATIS生成的SQL对不对,你可以用这个SQL监控框架,p6spy.
解决方案四:
你favorites 表的id字段是不是设置为auto_increment,而insert语句中又直接赋了#{id}检查下是不是可能这个原因造成的
解决方案五:
看了lz的问题,我也有些疑惑,经常遇到一些奇怪的问题,开始怀疑这怀疑那,后来找到问题的时候通常都是一些低级错误引起的。你可以试试这样,com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '58179889-353994' for key 'user_id' 这个异常应该是mysql的驱动包里的,你用Maven自动下载了源码,找到抛异常的这段代码看是否是捕获的,如果是捕获的话就去catch里打断点,如果是抛出的那外层肯定也有捕获的代码,应该能查到到当前的执行的sql另外你的mybatis是否有自定义拦截器?如果有仔细检查拦截器的代码,特别是if语句块的代码

时间: 2024-09-10 04:28:35

mysql写入数据,发生字段粘连问题的相关文章

php mysql显示数据表字段 SHOW FIELDS

php mysql显示数据表字段 SHOW FIELDS $mydbname=RepPostVar($_GET['mydbname']); $mytbname=RepPostVar($_GET['mytbname']); if(empty($mydbname)||empty($mytbname)) {  printerror("ErrorUrl","history.go(-1)"); } $form=$_GET['form']; if(empty($form)) {

超简单php向mysql写入数据例子

PHP向MySQL数据库中写入数据有三个步骤: 1,PHP和MySQL建立连接关系 2,打开MySQL数据库 3,接受页面数据,PHP录入到指定的表中 1.2两步可直接使用一个数据库链接文件即可:conn.php  代码如下 复制代码 <?php mysql_connect("localhost","root","");//连接MySQL mysql_select_db("hello");//选择数据库 ?> 当然

修改MYSQL数据库,数据表,字段的编码(解决JSP乱码)

js|mysql|编码|解决|数据|数据库 要解决JSP乱码,首先就要了解JSP乱码的原因 1.架设服务器安装MYSQL时的会让你选择一种编码,如果这种编码与你的网页不一致,可能就会造成JSP页面乱码2.在PHPMYADMIN或mysql-front等系统 创建数据库时会让你选择一种编码,如果这种编码与你的网页不一致,也有可能造成JSP页面乱码3.创建表时会让你选择一种编码,如果这种编码与你的网页编码不一致,也可能造成JSP页面乱码4.创建表时添加字段是可以选择编码的,如果这种编码与你的网页编码

MySQL中大数据表增加字段的实现思路

前言 增加字段相信大家应该都不陌生,随手就可以写出来,给 MySQL 一张表加字段执行如下 sql 就可以了: ALTER TABLE tbl_tpl ADD title(255) DEFAULT '' COMMENT '标题' AFTER id; 但是线上的一张表如果数据量很大呢,执行加字段操作就会锁表,这个过程可能需要很长时间甚至导致服务崩溃,那么这样操作就很有风险了. 那么,给 MySQL 大表加字段的思路如下: ① 创建一个临时的新表,首先复制旧表的结构(包含索引) create tab

y 中文乱码-PHP环语言对MySQL数据库进行中文字段的数据插入和查询时候遇到的乱码问题

问题描述 PHP环语言对MySQL数据库进行中文字段的数据插入和查询时候遇到的乱码问题 #定义插入数据库的时候定义插入的字符串的编码为 mysql_query('SET NAMES UTF8'); 这时候通过PhpMyadmin能够正常看到插入的正文字段信息,但是通过 mysql_query("select * from $table_name limit $offset,$rows"); 查询该字段的时候,显示的字段信息是乱码 如果不对插入数据库的编码做任何的定义,直接插入数据库中文

C#在MySQL大量数据下的高效读取、写入详解_C#教程

前言 C#操作MySQL大量数据最常见的操作便是 select 读取数据,然后在C#中对数据进行处理, 完毕后再插入数据库中.  简而言之就 select -> process -> insert 三个步骤. 对于数据量小的情况下(百万级别 or 几百兆)可能 最多1个小时就处理完了.但是对于千万级数据可能几天,甚至更多. 那么问题来了,如何优化?? 第一步 解决读取的问题 跟数据库打交道的方式有很多,我来列举下吧: 1. [重武器-坦克大炮]使用重型ORM框架,比如 EF,NHibernat

php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)

php.mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳) //其中 video 是表名: //createtime 是字段: // //数据库time字段为时间戳 // //查询当天: $start = date('Y-m-d 00:00:00'); $end = date('Y-m-d H:i:s'); SELECT * FROM `table_name` WHERE `time` >= unix_timestamp( '$start' ) AND `time` <= uni

数据-Mysql查询出现BLOB字段

问题描述 Mysql查询出现BLOB字段 我在做一个学校的学生数据录入,一共有1200+的班级学生表,用select union语句 把所有学生输出到屏幕时,班级编号栏出现blob,navicat下对blob点击备注,班级 编号是可以从备注显示的, 而我如果select union到第1064张班级表,班级编号栏是显示正常的,请问这是什么原因呢??

Mysql大数据量存储及访问的设计讨论

一.引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的问题.通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式.水平切分数据库,可以降低单台机器的负载,同时最大限度的降低了了宕机造成的损失.通过负载均衡策略,有效的降低了单台机器的访问负载,降低了宕机的可能性:通过集群方案,解决了数据库宕机带来的单点数据库不能访问的问题:通过读写分离策略更