Выполнение SQLite-запроса снизу вверху таблицы

Я пытаюсь увеличить первичное ключевое поле (_id) таблицы базы данных Android SQLite на 1 для всех записей с начальными значениями _id больше 21.

Я пробовал следующее:

UPDATE tableName SET _id = _id+1 WHERE _id > 21

Но после завершения первого обновления таблицы (с 22 по 23) есть 2 записи с _id = 23. Это создает ошибку. Есть ли способ избежать проблемы, запустив этот процесс из последней записи в первую, а не начиная с вершины?

Обратный процесс: UPDATE tableName SET _id = _id-1 WHERE _id > 21 работает без ошибок, когда _id = 21 нет, поэтому проблема с первым утверждением определенно связана с удвоением идентификаторов.

Я пытаюсь использовать DESC для решения этой проблемы. Мой текущий код следующий, но это не правильный синтаксис, и это только увеличивает последнюю запись:

UPDATE tableName SET _id = _id+1 WHERE _id = (SELECT _id FROM tableName WHERE _id > 21 ORDER BY _id DESC)

1 ответ

Вы можете сначала извлечь записи по убыванию, а затем обновить их

// query
 String sql = "SELECT _id FROM tableName WHERE _id > 21 ORDER BY _id DESC";

 db = this.getWritableDatabase();

 Cursor cursor = db
 .rawQuery(sql, null);

 if (cursor.moveToFirst()) {

 do {

 int id = cursor.getInt(cursor.getColumnIndex("_id"));

 // update related record

 } while (cursor.moveToNext());
 }

licensed under cc by-sa 3.0 with attribution.