失敗は一時の恥

パッケージソフト開発をしているプログラマが気の赴くままに何かを投稿するブログ.

DB による getGeneratedKeys の挙動の差

DB による getGeneratedKeys の挙動の差

Java で DB に書き込みを行ったあと,Statement#getGeneratedKeys() によって返される結果が DB 毎に違うのか調べてみました

調べた結果,実際に DB 毎に違いがあるようでした.

調査概要

DB は PostgreSQLMySQL を使用.

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 に限った話でもないので, 何事も広い視野を持ちたいものです.