ほとんどのドライバーはgetGeneratedKeys()
をサポートしています RETURNING
に取り組むことによって -自動生成される列を含むクエリの最後の句。 PostgreSQLにはRETURNING *
があるため、すべてのフィールドが返されます これは単にすべての列を返します。つまり、生成されたキーを返すために、システムテーブルにクエリを実行して、返す列を決定する必要がないため、ネットワークのラウンドトリップ(およびクエリ時間)を節約できます。
これは、JDBC仕様で暗黙的に許可されています。これは、言う :
行間を読むと、「わからない、または手間がかかるため、すべての列が自動生成されたキーを最もよく表している」と言うことができます。 。
追加の理由は、どの列が自動生成され、どの列が自動生成されないかを判断するのが非常に難しいことである可能性があります(それがPostgreSQLに当てはまるかどうかはわかりません)。たとえば、Jaybird(私が管理しているFirebirdのJDBCドライバー)では、自動生成された列を判別できないため、すべての列も返します(ただし、Firebird 3のため、システムテーブルに列名を照会する必要があります。以前はRETURNING *
がありません 。
そのため、生成されたキーResultSet
を明示的にクエリすることを常にお勧めします。 位置ではなく列名で。
他の解決策は、 String[]
またはint[]
(PostgreSQLドライバーがそれをどのように処理するかは100%わかりませんが)
ところで:Oracleは(以前は?)さらに悪いです:デフォルトではROW_ID
を返します 行の(生成された)値を取得するには、別のクエリを使用する必要があります。