【问题标题】:Getting the primary key value after a merge command?合并命令后获取主键值?
【发布时间】:2010-11-17 19:07:29
【问题描述】:

有没有办法从最后插入或更新的行中获取值?

如果行存在,我正在使用合并命令进行插入或更新。我知道如何在插入后获取自动生成的键,但是如果我使用合并命令,我可以获得主键吗?

我将 Java 与 JDBC 和 Oracle DB 结合使用。

【问题讨论】:

  • 大概你的意思是“upserts”的“合并到 USING ...”语法。我认为您做不到,但您可能想清楚地说明您在问题中所说的内容。
  • 与 INSERT 不同,Oracle MERGE 语法不支持 RETURNING 子句。唉。
  • “最后插入或更新的行”是什么意思?也就是说,MERGE 命令在处理数据方面没有顺序。我不确定知道随机排列的数据中最后一条记录是什么有用的。也许您可以提供架构和合并语句进行评估?

标签: java oracle jdbc merge primary-key


【解决方案1】:

正如 APC 所说“与 INSERT 不同,Oracle MERGE 语法不支持 RETURNING 子句。唉。”

恐怕对此最简单的答案是将您的业务逻辑实现为 PL/SQL 函数,该函数实现您的业务逻辑并返回您感兴趣的值。

将过程分解为 PL/SQL 中的步骤以检查行是否已经存在不应该太慢,因为您应该(我假设)直接查找主键(或至少是唯一索引的列)

【讨论】:

    【解决方案2】:

    远景:您可以在数据库中编写一个触发器,为任何更新或插入添加时间戳,并将时间戳放在您将命名的新列中:上次修改(或类似名称)。然后按此列排序以获取最后编辑的行。

    【讨论】:

    • 插入前触发器可以删除全局临时表中的所有内容。 “每行插入后”可以记录插入的数据。
    【解决方案3】:

    读完这篇文章后,经历了短暂的否认,寻找一些方法来使这个工作与 MERGE 语句一起工作,然后最终接受 APC 的评论,我决定了以下可能对其他人有帮助的替代方案:

    public List upsert(String updateSql, String insertSql, Map data){
      List ids = new ArrayList();
      Map params = new HashMap();
      params.put("name", data.get("name"));
      if(data.get("personId") != null){
        params.put("personId", data.get("personId"));
        int rowCount = jdbcTemplate.update(updateSql, params);
        if(rowCount == 1){
          ids.add(data.get("personId"));
        }
      }else{
        keyHolder = new GeneratedKeyHolder();
        int rowCount = jdbcTemplate.update(insertSql, params, keyHolder);
        if(rowCount == 1){
          ids.add(keyHolder.getKey().intValue());
        }
      }
      return ids;
    }
    

    【讨论】:

      【解决方案4】:

      我使用更高级别的持久层遇到了这个问题。我的解决方案是进行插入,然后获取生成的 ID 并更新到行中。我意识到不是最佳的,但我还没有找到更好的解决方案。

      但是,我发现非主键列的组合通常会产生唯一的行。如果您可以在数据库中识别此数据,我建议对列设置唯一约束,以保证它们是唯一的。一旦您有了另一种访问唯一行的方式,您就可以使用它来进行合并。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        相关资源
        最近更新 更多