Я пытаюсь выполнить массовое обновление таблицы, в которой есть уникальное ограничение для столбца, который я обновляю. Предположим, что таблица определяется как:
CREATE TABLE foo (id INTEGER PRIMARY KEY, bar INTEGER UNIQUE);
Предположим, что база данных содержит ряд строк с непрерывными целочисленными значениями в столбце bar
в диапазоне от 1 до 100, и что они были вставлены последовательно.
Предположим, я хочу вставить разрыв шириной в пять в последовательность "bar", начинающуюся с 17, например, с помощью такого запроса:
UPDATE foo SET bar = bar + 5 WHERE bar > 17;
SQLite отказывается выполнить это обновление, говоря «Error: UNIQUE constraint failed: foo.bar
». Хорошо, конечно, если запрос выполняется по одной строке за раз и начинается с первой строки, которая соответствует предложению WHERE, действительно, ограничение UNIQUE будет нарушено : две строки будут иметь столбец bar
со значением 23 (строка, где bar
было 18, и исходная строка, где bar
- 23). Но если бы я мог каким-то образом заставить SQLite запускать обновление снизу вверх (начиная с самого высокого значения для row
и работать в обратном направлении), ограничение UNIQUE не было бы нарушено.
SQLite имеет необязательное условие ORDER BY / LIMIT для UPDATE, но это не влияет на порядок, в котором происходят UPDATE; как указано в нижней части этой страницы , «порядок, в котором изменяются строки, является произвольным».
Есть ли какой-нибудь простой способ предложить SQLite обрабатывать обновления строк в определенном порядке? Или мне нужно использовать более сложный маршрут, такой как подзапрос?
ОБНОВЛЕНИЕ: Это не работает; появляется та же ошибка:
UPDATE foo SET bar = bar + 5 WHERE bar IN
(SELECT bar FROM foo WHERE bar > 17 ORDER BY bar DESC);