У меня есть следующая таблица (mariaDB):
+----+--------------+-------------+-------------+
| id | content_type | sort_number | document_id |
+----+--------------+-------------+-------------+
| 1 | text | 1 | 1 |
| 2 | table | 2 | 1 |
| 3 | text | 3 | 1 |
| 4 | image | 4 | 1 |
+----+--------------+-------------+-------------+
Комбинация sort_number и document_id уникальна.
Теперь, когда я хочу добавить новую запись в позицию 2, мне нужно на один шаг увеличить sort_number всех записей, где находится sort_number >= 2.
Для этого я использую следующий запрос:
update `table_name` set `sort_number` = sort_number +1 where `sort_number` > ? and `document_id` = ?
Но из-за уникального ключа (sort_number и document_id) я получаю сообщение об ошибке:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3' for key 'table_name_sort_number_document_id_unique'
Я устал избегать ошибки с SET unique_checks=0;, но все равно получаю ошибку ...
Есть ли (лучший) способ обновить sort_number за один запрос?
Добавьте order by sort_number desc в свой отчет об обновлении.






ORDER BY также применяется к запросу на обновление, так что просто:
SET @i:=0;
UPDATE items SET disp_order=@i:=@i+1 ORDER BY item_name;
Просто начните обновление с последней строки и двигайтесь в обратном направлении.
Мне нравится решение, предложенное Полом Шпигелем. Мой запрос теперь выглядит так:
update `table_name` set `sort_number` = sort_number +1 where `sort_number` > ? and `document_id` = ? order by `sort_number` desc
Вам нужно получить max (sort_number) для document_id, а затем увеличить sort_number этой строки