MySQLMySQLのTimestampを勘違いしていました。`・ω・))OracleのTimestampとは全然違って、そういう場合はDateTime型を使うのが正しいらしい。何が違うのかと言うと、データ追加時、または更新時、現在日時を自動で設定する。型の項目も更新しない。値を設定した場合、現在日時が設定される。(引用元)http://minazuki.cocolog-nifty.com/kaimemo/2008/01/mysql_timestamp_6d3b.htmlというわけで、基本的にはレコードの更新時間が入るみたいです。MySQLGeneratedKeyを使う方法は以前書きましたが、今回はiBatisを使った場合の方法です。1回の命令でシーケンスをエミュレートするやりかたを書いておきます。iBatisは以下の事が言えます。Insertの時だけSelectKeyで値を返すことができる(Updateの時は戻り値は更新件数)InsertタグでもUpdate文を発行する事は可能(JDBCレベルではexecuteUpdateを発行しているため)これらの事をふまえると、Insertタグの中にUpdate文を記述して、SelectKeyも併せて書くことでインクリメントした値を返すことができます。MySQLOracleやPostgreSQLにはSequenceがあるのですが、MySQLにはありません。AUTO_INCREMENTは便利なのですが、外部キーの参照先となるような場合に困ってしまいます。具体的には次のような感じです。テーブル設計や正規化云々の話は面倒なので言及しません。名簿テーブルのIDがAUTO_INCREMENTの場合に係り活動テーブルに入れるIDの取得に困ります。名簿テーブルにデータをINSERTする。(IDは自動生成で1が入ったとする)自動生成された1を取得するために以下の方法で取得するSELECTを発行するLAST_INSERT_ID()をコールする係り活動テーブルにデータをINSERTする。SELECTの場合、MAX関数使った場合はマルチスレッド、マルチプロセスで破綻します。́・ω・`)またAUTO_INCREMENTをやめてシーケンステーブルを作成した場合、SELECTは上記と同じ理由で破綻(ロックかけるなら別ですけど。)、LAST_INSERT_IDは上手くいくが、どちらにせよ2往復している事になります。DBがSEQUENCEをサポートしている場合(名簿テーブルのIDはAUTO_INCREMENTではありません)、シーケンスを進めて値を取得する(仮に1とする)名簿テーブルにデータをINSERTする係り活動テーブルにデータをINSERTするこんな感じで済みます。2往復は効率が悪そう。MySQLはシーケンスをサポートしていない。なれば作るしかなさそうです。INSERTの戻り値として自動生成された値を取得する場合、PERLではDBIのmysql_insertidを使えば出来、JDBCの場合はStatement#getGeneratedKey()を使う事で取得が可能になるようです。ちなみにOracleの場合はgetGeneratedKey()でカラムを取得してもRowId型になった気がします。(誰かのBLOGに載っていた予感)というわけで、早速コードを書いてみました。MySQL普通のSQLを発行するとINDEXが壊れて、自動リペアなども出来なくなります。エラーログには日本語訳すると「自動でリペアしようとしたけど失敗しちゃった!!テヘッ」と書かれてます。こんなトラブルは初めてだ・・。ERRORNo:1030MySQL5.0.33(ソースからビルド)で確認しました。やり方は以下の通りで。1);INDEXを貼っていなければ問題はありません。INSERT文中のSELECTの1列目の"1"と2列目のWHERE句中の"1"が異なる場合も問題ありません。COUNT(N2)でも問題ありません。MAX文で1件でもHITすれば問題ありません。酷い目にあった・・・。MySQL5.0.37ではエラーにはなるものの、INDEXが壊れることはない感じです。