要复制student里的部分数据,到student表里,用的是 insert into select。。。 开始生成uuid是带【’-‘】的,可是用replace替换就有问题,只生成一个uuid 把打印出来的sql在MySQL视图工具里直接执行时没有问题的,可是就在mybatis里 就出现这样的问题,而且是同replace一起使用的时候。
mysql数据库包 mysql-connector-java 版本是5.1.19,此版本会出现这个问题,换成5.1.30版本,没有问题,如果不想换,可以试试下面的方法
DROP TABLE IF EXISTS `student`;CREATE TABLE `student` ( `id` varchar(32) NOT NULL, `name` varchar(50) DEFAULT NULL, `tid` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`),) Mybatis mapper.xml <insert id="insertCopy"> INSERT INTO name(id,`name`,tid) SELECT UUID(),`name`,#{newtid} FROM student WHERE tid= #{oldtid} </insert>这种情况生成uuid是带【‘-’】的,长度为36位,数据库定义好id是32位 所以就想直接用replace替换掉【‘-’】不就可以了,可是…..
<insert id="insertCopy"> INSERT INTO name(id,`name`,tid) SELECT REPLACE(UUID(),'-',''),`name`,#{newtid} FROM student WHERE tid= #{oldtid} </insert>报错: Duplicate entry ‘4534c15dc2a111e6a9ab000ec6c596eb’ for key ‘PRIMARY’,显然主键冲突了, REPLACE (UUID(), ‘-‘, ”) 仅执行了一次,
<insert id="insertCopy"> INSERT INTO name(id,`name`,tid) SELECT REPLACE(temp.tempId,'-',''),`name`,#{newtid} FROM (SELECT UUID() tempId,item.* FROM student stu WHERE tid= #{oldtid}) temp </insert>报错: 还是这个问题,怎么办呢,加个group
<insert id="insertCopy"> INSERT INTO name(id,`name`,tid) SELECT REPLACE(temp.tempId,'-',''),`name`,#{newtid} FROM (SELECT UUID() tempId,item.* FROM student stu WHERE tid= #{oldtid} group by id) temp </insert>搞定!可以批量生成不同的UUID了
新闻热点
疑难解答