H2 DatabaseでのSEQUENCEのCYCLEオプションについて
H2のPostgreSQLモードのINSERTコマンドでつまずく。
Javaで組み込みタイプのデータベースを利用することにしました。長年の実績で選ぶとしたらSQLiteが有力だと思いましたが、Javaで実装されていてサイズも小型で軽量なH2も良さそうだったので採用しました。
H2の特長
1. 単体で組み込み・サーバーどちらのタイプでも運用可能。
2. PostgreSQLおよびMySQLをエミュレーションするモードがある。
3. WEBベースの管理ツールを内蔵している。
表題の件を、サンプルのデータベースを作成するところから、順を追って
レコードを追加する際、連番でプライマリキーを付与していき、キーが上限に達したら、初期値に戻して、レコードを上書きすることにより、循環して使い回して運用するのが目的です。
さらに追加しようとするとキーが初期値の位置に戻り、すでにレコードが存在するため下図のようにエラーになります。
H2にはPostgreSQLのようにINSERTコマンドにON CONFRICT DO UPDATEというオプションが用意されていないので代わりにプログラム側でUPDATEコマンドに変えてみますが、
このように、更新数: 0
となり上書き出来ません。
そこでひと手間かけて下図のように
2ステップかけて更新すれば、今度は大丈夫です。
なぜ2ステップにしなければならず、1ステップではうまくいかないのかが分かりません。何か勘違いしているところがあるのでしょうか?
それにしても、サイクリックなシーケンスを利用できるのに、INSERT ~ ON CONFLICT DO UPDATE ~
という構文が使えないというのは切ないものがあります。
もし使えれば
INSERT INTO city_list SET code=(SELECT NEXT VALUE FOR code_seq), name='Paris'
ON CONFLICT DO UPDATE city_list SET name='Paris' WHERE code=(SELECT CURRENT VALUE FOR code_seq);
とコーディングすればよいだけだと思いますので。
どなたかデータベースに精通した方にご教授頂けると、大変ありがたいことと存じます。