2

2列の主キーを持つMySQLテーブルがあります。後者は、以前はMyISAMであったときに自動インクリメントされていました。InnoDBに切り替えたとき、auto_increment列を、挿入前のトリガーでmax()+1に更新される通常のintに変換する必要がありました。今のところ問題ありません。

挿入を行うJavaPreparedStatementは、Oracle / etcのRETURNING関数を使用せずに、挿入されたばかりの行のlast_insert_idを知っている必要があります。その値を取得する最善の方法がわかりません。すべての挿入関数をストアド関数にラップしたり、2番目のクエリを要求したりせずに、エミュレートされた自動増分値を取得する方法はありますか?

参考までに、次のようなものがあります(これを書き出すだけなので、完璧ではないかもしれませんが、アイデアが伝わるはずです):

CREATE TABLE t(
  id1 int NOT NULL、
  id2 int NOT NULL DEFAULT '0'、
  主キー(id1、id2)
)ENGINE = InnoDB;
区切り文字$$
tに挿入する前にトリガーt_auto_incrementを作成します
各行について
始める
    SET NEW.id2 =(SELECT MAX(id2)+1 FROM t WHERE id1 = NEW.id1);
END $$
区切り文字;

他のDBエンジンでは、挿入クエリでid2を返すように指示できます。これで問題は解決すると思いますが、MySQLはこれをサポートしていないようです。すべての挿入をラップするために格納された関数の数を作成したくないので、変数を設定して後でそれを探すのが最善だと思いました。もちろん、サーバーへのクエリは軽いでしょう。

4

0 に答える 0