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)。档案 数字是相对于表空间的
SELECT ROWID, last_name
FROM employees
WHERE department_id = 20;
行的
rowid
保持不变,即使行迁移时也是如此 我想您可以尝试使用ROWID
pseudocolumn。
对于数据库中的每一行,ROWID
pseudo列返回该行的地址。Oracle数据库rowid值包含查找行所需的信息:
- 对象的数据对象编号
- 行所在的数据文件中的数据块
- 行在数据块中的位置(第一行为0)
- 行所在的数据文件(第一个文件是1)。档案 数字是相对于表空间的
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消息)/将记录更新到已处理的
。