0

I'm trying to insert a row into my table, only if it doesn't already exist (based on a unique id (myId)). I don't want to query every single row before inserting as that takes some time. I'd like to just try to insert, and if it fails that's fine. Is there a way to do this?

At the moment, I'm doing:

    try {
        sqlObj.executeInsert(query)
    }
    catch (Exception e) {
        println "Sql Exception"
    }

but this is kind of slow, as almost every row throws an exception in some cases. Is there a way to handle this in SQL/Groovy/Postgresql?

4

1 に答える 1

1

SQLのマージ ステートメントを使用すると、行が存在する場合と存在しない場合の代替ロジックを指定できます。次のように書くことができます。

MERGE INTO tablename USING table_reference ON (condition)
   WHEN NOT MATCHED THEN
   INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...

(これはウィキペディアの「一致した場合」の部分を削除した例です。

キーの存在を確認するための選択に時間がかかるのは少し厄介です。Java ですべての行をループするのではなく、select * ステートメントを使用していますか? また、id フィールドにインデックスはありますか? インデックスがない場合、merge ステートメントには、パフォーマンスに関して現在発生している問題と同じ問題があります。

于 2013-10-09T01:07:15.970 に答える