如何正确更新记录(如果存在)或添加(不存在)(UPSERT)?

时间:2019-04-12 07:22:27

标签: java sql postgresql jdbc

有一个包含许多对象的集合。集合显示在表格中。离线用户可以添加和删除记录,以及通过SELECT * FROM ...

更新以前收到的记录

我想实现“保存所有”功能,程序将遍历所有集合并更新数据库中的记录(如果存在),并添加新记录(如果不存在)。

熟悉以下解决方案(在Java方面):

@Override
public void updateAll(List<User> users)
{
    //online
    Connection connection = null;
    PreparedStatement statement = null;

    try
    {
        connection = Database.getInstance().getConnection();
        connection.setAutoCommit(false);

        for (User user : users)
        {
            statement = connection.prepareStatement("");  //THIS IS WHERE A CORRECT QUERY SHOULD BE CREATED
            statement.execute();
        }

        connection.commit();
    }
    catch (SQLException ex)
    {
        Log.error("Unable to updateAll users. " + ex.getMessage());
    }
    finally
    {
        Database.closeQuietly(statement);
        Database.closeQuietly(connection);
    }
}

由于该表的内容可能会进行重大更新,但是有必要快速保存,因此我禁用了自动提交功能,并一次发送了一大批请求。

现在有关请求本身...我found PostgreSQL支持我需要的功能:

INSERT INTO the_table (id, column_1, column_2) 
VALUES (1, 'A', 'X'), (2, 'B', 'Y'), (3, 'C', 'Z')
ON CONFLICT (id) DO UPDATE 
  SET column_1 = excluded.column_1, 
      column_2 = excluded.column_2;

立即出现了几个问题:

  • 现在我需要将其放在PreparedStatement中。我知道如何安全地在请求的INSERT部分插入数据,但是UPDATE部分呢,您需要在方括号中列出所有数据-除了字符串连接,什么都没想到,但据我所知,这不是绝地方式。
  • 由于我需要比插入新数据更频繁地更新数据,因此使用INSERT部分作为基础是否正确,然后在存在更新后才执行UPDATE?也许我不应该徒劳,也许真的会影响速度吗?交换?但是如何?

0 个答案:

没有答案