要复制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了