随分前に、MySQL の UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT のメモを書いていた。
https://oboe2uran.hatenablog.com/entry/2018/02/01/160016
CREATE TABLE branches ( id INT(4) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT , branch_name VARCHAR(60) NOT NULL , PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
この時、mybatis で、INSERT 実行時、<selectKey> で、LAST_INSERT_ID() をそのまま取ると
0埋めはされていない。
package org.labo.data; import java.io.Serializable; /** * Branch */ public class Branch implements Serializable{ public String id; public String branch_name; }
<insert id="insertBranch" parameterType="org.labo.data.Branch"> INSERT branches (branch_name) VALUES( #{branch_name} ) <selectKey keyProperty="id" resultType="string" order="AFTER" > SELECT LAST_INSERT_ID() </selectKey> </insert>
これでは、0埋めはされない。ではどうするか、
(INSERT 後、通常のSELECTクエリでは、String で0埋めされてるが、LAST_INSERT_ID() では0埋めされない)
LPAD を使えばいい。
今回、INT(4) なので、LPAD で、4文字になるように指定する
<insert id="insertBranch" parameterType="org.labo.data.Branch"> INSERT branches (branch_name) VALUES( #{branch_name} ) <selectKey keyProperty="id" resultType="string" order="AFTER" > SELECT LPAD(LAST_INSERT_ID() , 4, '0') </selectKey> </insert>
昔書いたもの(メモ)
DELIMITER // DROP TABLE IF EXISTS barcode_seq // CREATE TABLE barcode_seq ( id INT(4) NOT NULL, barcode_no INT(11) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 // TRUNCATE TABLE barcode_seq // INSERT INTO barcode_seq (id, barcode_no) VALUES (1, 101) // commit // DROP FUNCTION IF EXISTS next_barcode // CREATE FUNCTION next_barcode(i INT) RETURNS char(8) CHARSET utf8 BEGIN UPDATE barcode_seq SET barcode_no=LAST_INSERT_ID(barcode_no+1) WHERE id = i; RETURN LPAD(LAST_INSERT_ID(), 8, '0'); END // DELIMITER ; DELIMITER // DROP FUNCTION IF EXISTS next_barcode // CREATE FUNCTION next_barcode(i INT) RETURNS char(8) CHARSET utf8 BEGIN DECLARE res VARCHAR(8); DECLARE num INT; SELECT barcode_no + 1 INTO num FROM barcode_seq WHERE id = i FOR UPDATE; UPDATE barcode_seq SET barcode_no = num WHERE id = i; SELECT LPAD(barcode_no, 8, '0') INTO res FROM barcode_seq WHERE id = i; RETURN res; END; // DELIMITER ;