mybatis中 insert into select 批量生成uuid時 用replace去掉"-"只生成一個uuid

要複製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了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章