(My) SQL - пакетное обновление - PullRequest
       5

(My) SQL - пакетное обновление

1 голос
/ 16 сентября 2009

Эй, у меня есть таблица со столбцами "id", "name" и "weight". Вес - это беззнаковое малое число.

У меня есть страница, на которой отображаются элементы, упорядоченные по «весу ASC». Он будет использовать drag-n-drop, и, как только порядок изменится, он передаст строку идентификаторов через запятую (в новом порядке).

Допустим, в этой таблице 10 пунктов. Вот что у меня есть:

Пример ввода:

5,6,2,9,10,4,8,1,3,7

Пример обработчика PHP (за исключением обработчиков ошибок и безопасности):

<?php
$weight = 0;
$id_array = explode(',', $id_string);

foreach ($id_array as $key => $val)
{
    mysql_query("UPDATE tbl SET weight = '$weight' where id = '$val' LIMIT 1");
    $weight++;
}
?>

Когда я внесу изменение в порядок столбцов, мой сценарий должен будет сделать 10 отдельных запросов UPDATE или есть лучший способ?

Ответы [ 5 ]

8 голосов
/ 16 сентября 2009

Вы можете создать временную таблицу с новыми данными в ней (т. Е. Id и weight - это столбцы), а затем обновить таблицу с этими данными.

create temporary table t (id int, weight float);

insert into t(id, weight) values (1, 1.0), (2, 27), etc

update tbl inner join t on t.id = tbl.id
set tbl.weight = t.weight;

Итак, у вас есть один оператор создания, один оператор вставки и один оператор обновления.

3 голосов
/ 16 сентября 2009

Вы можете указать только одно предложение where в одном запросе - это означает, что в вашем случае вы можете обновлять только одну строку за раз.


С 10 предметами, я не знаю, справлюсь ли я с такими проблемами (это означает переписывание некоторого кода - даже если это не так сложно) , но, более того, решение будет быть до:

  • delete все строки
  • insert s их все обратно
  • делает все это в транзакции , конечно.

Приятно то, что вы можете сделать несколько insert с одним запросом; не знаю по 10 предметам, но по 25 или 50 это может быть неплохо.

Вот пример со страницы вставки руководства MySQL (цитирование) :

INSERT операторы, которые используют VALUES Синтаксис может вставлять несколько строк. Сделать это, включить несколько списков столбцов значения, каждое из которых заключено в круглые скобки и разделенные запятыми.
Пример: * 1 034 *

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

Конечно, вам, вероятно, не следует вставлять «слишком много» элементов в один запрос на вставку - вставка на 50 элементов может быть приемлемой, хотя (чтобы найти «правильное» количество элементов, вы Я полагаю, что ^^)

1 голос
/ 16 сентября 2009

10 обновлений - самый простой концептуальный способ. если у вас есть несколько строк, которые необходимо обновить, вам, возможно, придется попробовать что-то другое, например, создать временную таблицу и использовать JOIN в вашем выражении UPDATE или подзапрос с конструктором строк.

1 голос
/ 16 сентября 2009

Да, вам нужно будет сделать 10 обновлений. Существуют способы пакетирования нескольких запросов за один вызов mysql_query, но, вероятно, лучше этого избежать.

Если вас беспокоит производительность, убедитесь, что вы сначала попробовали ее, прежде чем беспокоиться об этом. Я подозреваю, что выполнение 10 (или даже 20 или 30) обновлений будет достаточно быстрым.

0 голосов
/ 08 декабря 2011

Сохраните записи во временной таблице с пакетной вставкой и удалите записи из таблицы, а затем из временной таблицы выполните пакетную вставку в таблице

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...