2015-12-11 9 views
0

У меня есть таблица без уникальных индексов кортежей, позволяет сказать, что таблица содержит записьSQL Update поле без уникальных индексов полого

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

Я получаю первую и вторую запись, обрабатывая их. После этого я хочу обновить только эти две записи

Как я могу сделать этот процесс возможным на уровне приложения Java?

Поскольку не существует какое-либо уникальные индексы tupples я не могу использовать обновления SQL при правильном ИНЕК

Использования Spring 3.XX Oracle 11g

+0

Зачем нужен индекс для предложения WHERE? –

+0

@TimBiegeleisen Я думаю, он имеет в виду ПК. Итак, mmc, почему вы не создаете ПК и не решаете плохой дизайн db? –

+0

Эта таблица является таблицей транзакций, и я не хочу тратить дополнительное время записи на запись, используя PK –

ответ

3

Я думаю, вы можете попробовать использовать ROWID псевдостолбца. Для каждой строки в базе данных псевдоколонка ROWID возвращает адрес строки. База данных Oracle RowId значения содержат информацию, необходимую, чтобы найти строку:

  • Объект данных номер объекта
  • Блок данных в файле данных, в которой строка проживает
  • Положения строки в данном block (first row is 0)
  • Файл данных, в котором находится строка (первый файл равен 1). Файл номер относится к табличному пространству.

Обычно значение rowid уникально идентифицирует строку в базе данных. Однако строки в разных таблицах, которые хранятся вместе в одном кластере, могут иметь один и тот же rowid.

SELECT ROWID, last_name 
    FROM employees 
    WHERE department_id = 20; 

rowid для строки остается неизменным, даже когда строка мигрирует.

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.

+0

Возможно ли массовое обновление для всех ResultSet? –

+0

Нет, это невозможно. Однако, если вы беспокоитесь о производительности, это решение на самом деле является самым быстрым способом обновления, не вытягивая серьезных хаков. Два года назад я провел целый день, экспериментируя с различными технологиями обновления, чтобы ускорить критическую систему. Я согласился с этим, теперь пропускная способность выше 1.200 сообщений/сек на одном сервере, включая чтение/обработку (сообщение jms)/запись обновления в 'обработанный'. –

Смежные вопросы