sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLJDBCgetGeneratedKeysはすべての列を返します

    ほとんどのドライバーはgetGeneratedKeys()をサポートしています RETURNINGに取り組むことによって -自動生成される列を含むクエリの最後の句。 PostgreSQLにはRETURNING *があるため、すべてのフィールドが返されます これは単にすべての列を返します。つまり、生成されたキーを返すために、システムテーブルにクエリを実行して、返す列を決定する必要がないため、ネットワークのラウンドトリップ(およびクエリ時間)を節約できます。

    これは、JDBC仕様で暗黙的に許可されています。これは、言う

    行間を読むと、「わからない、または手間がかかるため、すべての列が自動生成されたキーを最もよく表している」と言うことができます。

    追加の理由は、どの列が自動生成され、どの列が自動生成されないかを判断するのが非常に難しいことである可能性があります(それがPostgreSQLに当てはまるかどうかはわかりません)。たとえば、Jaybird(私が管理しているFirebirdのJDBCドライバー)では、自動生成された列を判別できないため、すべての列も返します(ただし、Firebird 3のため、システムテーブルに列名を照会する必要があります。以前はRETURNING *がありません 。

    そのため、生成されたキーResultSetを明示的にクエリすることを常にお勧めします。 位置ではなく列名で。

    他の解決策は、 String[] または int[] (PostgreSQLドライバーがそれをどのように処理するかは100%わかりませんが)

    ところで:Oracleは(以前は?)さらに悪いです:デフォルトではROW_IDを返します 行の(生成された)値を取得するには、別のクエリを使用する必要があります。



    1. Logstash:外部のAmazonRDSデータベースに接続できません

    2. postgresqlで削除された行を取り戻しました

    3. PDO/MySQLプリペアドステートメントを使用したパラメーターとしてのテーブル名

    4. テストのためにMySQLインスタンスを失敗またはクラッシュさせる方法