LAST_INSERT_ID() の 0埋め

随分前に、MySQLUNSIGNED 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 ;