1

インポートするレコードがいくつかあります。初めて挿入するときでも大丈夫です。同じデータを再度インポートしようとすると、org.postgresql.util.PSQLException: エラー: 重複したキー値が一意の制約に違反しています。データが同じ/または変更されている場合はデータベース内のレコードを更新し、JDBC を使用して新しいデータである場合は挿入するにはどうすればよいですか?

public void store(Object entity) throws Exception {
    try {
        if (this.updateEntity((XEntity) entity) == 0) {
            this.insertEntity((XEntity) entity);
        }

        ...

    } catch (SQLException sqlEx) {
        ...
    }
}

private int updateEntity(XEntity entity) throws SQLException {
    PreparedStatement prepStmt = this.getUpdatePreparedStmt();
    ...
    return prepStmt.executeUpdate();
}

private void insertEntity(XEntity entity) throws SQLException {
    ...
    this.getInsertPreparedStmt().executeUpdate();
}

問題は修正されました。以下に回答を示しました。

4

4 に答える 4

1

postgres SQL 'MERGE' または 'REPLACE' を使用して試すことができます

于 2010-12-07T07:54:17.633 に答える
0

このテストロジックは機能します。

if (this.updateEntity((XEntity) entity) == 0) {
    this.insertEntity((XEntity) entity);
}

問題は、レコードを更新する方法にありました。更新準備済みステートメントのWHERE句は、異なるデータ(スペースを含むデータ)を使用していたため、updateEntityは常に0を返します。これが、更新ではなく挿入のみが行われた理由です。ご助力ありがとうございます。

于 2010-12-07T11:57:21.363 に答える
0

JDBCを介してUPDATEコマンドを文字列として渡すことができます。

このSOの投稿によると、2つのステートメントを作成する必要があります。

于 2010-12-07T08:10:27.663 に答える
0

データの挿入と更新に同じ方法を使用する場合は、最初にデータが存在するかどうかを確認する必要があります。新しいオブジェクトを挿入するために使用される SQL コマンドは ですINSERTが、要素を更新するために使用される SQL コマンドは ですUPDATE。したがって、SELECTデータが既にここにあるかどうかを確認するために を実行し、結果に基づいてINSERTorを実行することができます。UPDATE

ただし、これは回避策です。実装を明確にし、データを追加するか更新するかにかかわらず、さまざまなメソッドを作成する必要があります。ビジネス側では、これらは明らかに 2 つの非常に異なる機能であるため、1 つの方法で両方を処理するのは設計上の問題のように思えます。

于 2010-12-07T10:20:52.980 に答える