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付けた方がいいのかが気になる。