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

withBatchを使用したBatchUpdateExceptionの処理

    アレクサンドロスのコメントに記載されている投稿でこれを解決することができました。ソリューションは次のようになります:

    sql.withTransaction {
        try {
            sql.withBatch(1000, 'insert into category (id, version, name, parent_id) ' +
            'select :id, :version, :name, :parent_id ' +
            'where not exists (select name, parent_id from category where name = :name and parent_id = :parent_id);') { stmt ->
                categoryInserts.each {
                    try {
                        stmt.addBatch([id: it.id, version: 0, name: it.name, parent_id: it.parent?.id])
                    } catch (SQLException e) {
                      log.error("Category ${it.name} with parent ${it.parent?.id} could not be inserted.")
                    }
                }
            }
        } catch (BatchUpdateException e) {
            log.error("Categories could not be inserted.", e)
        }
    
        sql.commit()
    }
    

    これはSQLのpostgresql方言で解決されることに注意してください。他のDBMSの場合、withBatchメソッドでSQLプロシージャを使用すると便利なアプローチになる可能性があります。

    標準SQLを使用してこれを行う方法を誰かが知っている場合は、ヒントを教えてください。




    1. ソートされたパスの利点について

    2. SQLのネストされたウィンドウ関数

    3. 次のクエリはSQLピボットで可能ですか?

    4. MySQLで[a-zA-Z]以外の文字を含むすべての行を取得する方法