没有唯一索引字段的SQL Update字段

时间:2015-12-11 07:07:54

标签: java sql spring oracle

我有没有唯一索引元组的表,假设表有记录

A->B->Status
A->C->Status
A->B->Status
A->B->Status 
A->C->Status

我得到第一和第二条记录,处理它们。之后我想只更新这两个记录

如何在java应用层实现此过程?

由于没有任何唯一索引tupples,我不能将update SQL与正确的WHERE子句

一起使用

使用 Spring 3.XX Oracle 11g

2 个答案:

答案 0 :(得分:3)

我想你可能会尝试使用ROWID伪列。 对于数据库中的每一行,ROWID伪列返回行的地址。 Oracle数据库rowid值包含查找行所需的信息:

  • 对象的数据对象编号
  • 行所在的数据文件中的数据块
  • 数据块中行的位置(第一行为0)
  • 行所在的数据文件(第一个文件为1)。文件 number是相对于表空间的。

通常,rowid值唯一标识数据库中的行。但是,同一群集中存储在一起的不同表中的行可以具有相同的rowid。

SELECT ROWID, last_name  
   FROM employees
   WHERE department_id = 20;

行的rowid保持不变,即使行迁移也是如此。

答案 1 :(得分:2)

您可以使用可更新的结果集来解决此问题。此功能依赖于rowid来执行所有修改(删除/更新/插入)。

这是一个突出显示功能本身的摘录:

String sqlString = "SELECT EmployeeID, Name, Office " + 
        " FROM employees WHERE EmployeeID=1001";
    try {
        stmt = con.createStatement(
                ResultSet.TYPE_SCROLL_SENSITIVE, 
                ResultSet.CONCUR_UPDATABLE);
        ResultSet rs = stmt.executeQuery(sqlString);

        //Check the result set is an updatable result set
        int concurrency = rs.getConcurrency();
        if (concurrency == ResultSet.CONCUR_UPDATABLE) {
            rs.first();
            rs.updateString("Office", "HQ222");
            rs.updateRow();
        } else {
        System.out.println("ResultSet is not an updatable result set.");
        }
        rs.close();
    } catch(SQLException ex) {
        System.err.println("SQLException: " + ex.getMessage());
    }

这是一个完整的example