Какой наилучший способ обновить несколько уникальных строк таблицы в MySQL?

#mysql #rows

#mysql #строки

Вопрос:

У меня есть список элементов в таблице MySQL. Пользователь может упорядочивать эти элементы, перетаскивая их вверх и вниз в HTML-списке. Затем мне нужно сохранить позицию каждого элемента в списке.

Возможно ли это сделать в одном вызове MySQL или это должен быть отдельный вызов для каждого продукта, чтобы задать свой собственный идентификатор заказа?

Один вызов будет выглядеть примерно так:

 UPDATE table_name SET `order` = order_number AND `product_id` = 'X';
  

Комментарии:

1. Итак, в чем именно заключается вопрос. Если бы вы хотели обновить много уникальных строк, вам пришлось бы изменить предложение WHERE no? Так что же делает ее уникальной?

2. Каждая строка в таблице представляет собой уникальный продукт с уникальным идентификатором … каждый атрибут заказа продукта также уникален — то есть никакие два продукта не могут иметь одинаковый order номер.

Ответ №1:

Ну, вы могли бы удалить всю таблицу, а затем вставить новые номера заказов для всех продуктов. Это всего лишь два оператора. Это будет работать до тех пор, пока эта таблица содержит только информацию «порядок» и никаких других важных данных.

Комментарии:

1. Я знаю об этом методе… но мне было интересно, могли ли быть какие-либо лучшие решения, которые не предполагают удаления данных, особенно для сценариев, где данные не могут быть удалены из-за ограничений внешнего ключа, и в этом случае, я думаю, решением было бы создать другую таблицу, содержащую только идентификаторы продуктов и их порядковый номер.

2. Я создал отдельную таблицу, которая содержит только идентификатор продукта и отображаемый номер заказа. Затем я очищаю таблицу и повторно заполняю, как вы предложили.

Ответ №2:

Вы могли бы удалить все рассматриваемые элементы и вставить их обратно, если это не повлияет на другие данные (КАСКАД и подобные). Это было бы два запроса; УДАЛИТЬ с помощью «WHERE product_id IN (‘X’, ‘Y’, …)» и ВСТАВИТЬ с обновленными значениями для каждого элемента.

Чистым решением было бы выполнить ОБНОВЛЕНИЕ в транзакции, но поскольку MySQL не поддерживает проверку отложенных ограничений, у вас возникнет проблема, если атрибут ‘order’ УНИКАЛЕН.