Игнорировать уникальный ключ при обновлении некоторых строк (mariaDB)

У меня есть следующая таблица (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 за один запрос?

Вам нужно получить max (sort_number) для document_id, а затем увеличить sort_number этой строки

karen 02.08.2018 18:29

Добавьте order by sort_number desc в свой отчет об обновлении.

Paul Spiegel 02.08.2018 19:45
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
39
2

Ответы 2

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

Другие вопросы по теме