DB による getGeneratedKeys の挙動の差
DB による getGeneratedKeys の挙動の差
Java で DB に書き込みを行ったあと,Statement#getGeneratedKeys()
によって返される結果が DB 毎に違うのか調べてみました
調べた結果,実際に DB 毎に違いがあるようでした.
調査概要
DB は PostgreSQL と MySQL を使用.
INSERT と UPDATE を実行し,getGeneratedKeys()
に何が含まれているのかを確認します.
作成するテーブルは次のような定義です.
CREATE SEQUENCE test_seq START 1; CREATE TABLE test_table ( id BIGINT PRIMARY KEY DEFAULT nextval('test_seq'), value TEXT );
CREATE TABLE test_table ( id BIGINT AUTO_INCREMENT, value TEXT, INDEX(id) );
結果
DB | INSERT した id | INSERT した value | UPDATE した行 |
---|---|---|---|
PostgreSQL | 取得できる (*1) | 取得できる (*1) | 取得できる (*1) |
MySQL | 取得できる (*2) | 取得できない | 取得できない |
(*1) 値の取得には,列のインデックスと名前のどちらでも使うことができる.
(*2) 値の取得には,列のインデックスのみを使うことができる.
調査内容の詳細
実装は GitHub のリポジトリ においてあります.
// 実は MySQL はほぼ初めて扱ったので,何か勘違いをしているかも…… (不安)
所感
ふだん PostgreSQL しか使っていないのですが, 他の DB や SQL の標準仕様なんかはどうなっているのか? ってことをたまには気にしたいと思いました.
「たまたま PostgreSQL だから動いている」 ような実装をしないようにしたいですね.
そもそもですが,こういう問題は DB や SQL に限った話でもないので, 何事も広い視野を持ちたいものです.