itochin2の日記(仮)

主に備忘録。Perl、MySQL、Unity、開発管理などについて情報を残していきたい。

Tengで採番テーブルを実装

LAST_INSERT_IDを使った採番テーブルを作った時のメモ。

ココらへんをパクリ参考にさせて頂きました。
http://blog.livedoor.jp/sasata299/lite/archives/51280681.html
http://engineer.dena.jp/2010/11/mysql-for-socialgame.html

updateした時のLAST_INSERT_IDで採番する仕組みを実装しようとしたけど
Tengのupdateは更新レコード数を返すIFしかない。
なので、executeを呼び出してハンドラを受け取るようにすればOK。

他のところでも使うし、プラグインとして実装。

package Teng::Plugin::Sequential;
use strict;
use warnings;

our @EXPORT = qw/last_insert_id/;

# mysqlのinsertidを取得する
sub last_insert_id {
  my ($self, $table, $column, $where, $opt) = @_;
  
  my ($sql, @binds) = $self->sql_builder->update(
    $table,
    [ $column => \"LAST_INSERT_ID($column + 1)"],
    $where,
    $opt
  );
  my $sth = $self->execute($sql, \@binds);
  return $sth->{mysql_insertid};
}

1;
__END__

呼び出し側

my $guild_id = $teng->last_insert_id('tbl_guild_id', 'id');

実際のテーブル

CREATE TABLE tbl_guild_id
(
  `id` bigint(20)  NOT NULL
) 
  ENGINE=InnoDB 
  DEFAULT CHARSET=utf8
;
INSERT INTO tbl_guild_id values(0);

「guild_id」とか、ソシャゲ作ってる感が満載だけど、まぁいいだろう(゚∀゚)

それより、カラムは一つでもPK付けた方がいいのかが気になる。