Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 没有唯一索引字段的SQL更新字段_Java_Sql_Spring_Oracle - Fatal编程技术网

Java 没有唯一索引字段的SQL更新字段

Java 没有唯一索引字段的SQL更新字段,java,sql,spring,oracle,Java,Sql,Spring,Oracle,我有一个没有唯一索引元组的表,假设表有记录 A->B->Status A->C->Status A->B->Status A->B->Status A->C->Status 我正在获取第一条和第二条记录,并对它们进行处理。之后,我只想更新这两条记录 如何在java应用层实现这个过程 由于没有任何唯一的索引元组,我无法使用带有适当WHERE子句的UPDATESQL 使用 春季3.XX Oracle 11g我认为您可以尝试使用ROWID

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

A->B->Status
A->C->Status
A->B->Status
A->B->Status 
A->C->Status
我正在获取第一条和第二条记录,并对它们进行处理。之后,我只想更新这两条记录

如何在java应用层实现这个过程

由于没有任何唯一的索引元组,我无法使用带有适当WHERE子句的UPDATESQL

使用 春季3.XX
Oracle 11g

我认为您可以尝试使用
ROWID
pseudocolumn。 对于数据库中的每一行,
ROWID
pseudo列返回该行的地址。Oracle数据库rowid值包含查找行所需的信息:

  • 对象的数据对象编号
  • 行所在的数据文件中的数据块
  • 行在数据块中的位置(第一行为0)
  • 行所在的数据文件(第一个文件是1)。档案 数字是相对于表空间的
通常,rowid值唯一标识数据库中的行。但是,存储在同一集群中的不同表中的行可以具有相同的rowid

SELECT ROWID, last_name  
   FROM employees
   WHERE department_id = 20;

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

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

  • 对象的数据对象编号
  • 行所在的数据文件中的数据块
  • 行在数据块中的位置(第一行为0)
  • 行所在的数据文件(第一个文件是1)。档案 数字是相对于表空间的
通常,rowid值唯一标识数据库中的行。但是,存储在同一集群中的不同表中的行可以具有相同的rowid

SELECT ROWID, last_name  
   FROM employees
   WHERE department_id = 20;

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

您可以通过使用可更新的结果集来解决此问题。此功能依赖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());
    }

这是一个完整的解决方案。

您可以使用可更新的结果集来解决此问题。此功能依赖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());
    }

这是一个完整的。

为什么你需要一个索引来包含一个
WHERE
子句?@TimBiegeleisen我想他指的是PK。所以mmc,为什么你不创建一个PK并解决一个糟糕的db设计呢?这个表是事务表,我不想通过使用PK来花费额外的“写db”时间,所以你宁愿花时间解决糟糕的设计?db是用来处理写PK的。试图优化工程师已经做了很多次的事情并不是明智地使用资源。在实时生产系统上很好地改变数据库设计通常是不可能的。通常风险太高,最后的决定是由不愿意承担任何风险的人做出的。为什么你需要一个索引来包含一个
WHERE
子句?@TimBiegeleisen我想他指的是PK。所以mmc,为什么你不创建一个PK并解决一个糟糕的db设计呢?这个表是事务表,我不想通过使用PK来花费额外的“写db”时间,所以你宁愿花时间解决糟糕的设计?db是用来处理写PK的。试图优化工程师已经做了很多次的事情并不是明智地使用资源。在实时生产系统上很好地改变数据库设计通常是不可能的。通常风险太高,最后的决定是由不想冒任何风险的人做出的。不,那是不可能的。然而,如果您担心性能,上述解决方案实际上是最快的更新方式,而无需进行严重的黑客攻击。两年前,我花了一整天的时间试验不同的更新技术,以加速关键系统。我解决了这个问题,现在单台服务器上的吞吐量超过了1.200条消息/秒,包括读取/处理(jms消息)/将记录更新到
已处理的
。不,这是不可能的。然而,如果您担心性能,上述解决方案实际上是最快的更新方式,而无需进行严重的黑客攻击。两年前,我花了一整天的时间试验不同的更新技术,以加速关键系统。我解决了这个问题,现在单台服务器上的吞吐量超过了1.200条消息/秒,包括读取/处理(jms消息)/将记录更新到
已处理的