Как сделать несколько update в одном запросе sql

211
11 августа 2018, 09:00

Нужно сделать вот такой update но каждый раз так писать это я так понял не есть хорошо к тому же этих обновлений может бить разное количество.

Так вот как все то что я написал ниже написать в один запрос?

$sql = "UPDATE `categories` SET `name`='Категория 1' WHERE `cat`='1'"; 
$sql = "UPDATE `categories` SET `name`='Категория 2' WHERE `cat`='2'"; 
$sql = "UPDATE `categories` SET `name`='Категория 3' WHERE `cat`='3'"; 
$sql = "UPDATE `categories` SET `name`='Категория 4' WHERE `cat`='4'";

В основном таких запросов будет не больше 6 но как то в цикле их делать не хочу, боюсь нагрузит сайт :(

Answer 1

Если речь о MySql то можно воспользоваться INSERT + ON DUPLICATE KEY UPDATE

INSERT INTO mytable (id, a, b, c)
VALUES (1, 'a1', 'b1', 'c1'),
(2, 'a2', 'b2', 'c2'),
(3, 'a3', 'b3', 'c3'),
(4, 'a4', 'b4', 'c4'),
(5, 'a5', 'b5', 'c5'),
(6, 'a6', 'b6', 'c6')
ON DUPLICATE KEY UPDATE id=VALUES(id),
a=VALUES(a),
b=VALUES(b),
c=VALUES(c);

Смысл в том, что если запись уже существует в таблице по primary key, то она обновится данными, которые Вы описали после конструкции ON DUPLICATE KEY UPDATE

Источник

Answer 2

Вы немножко не понимаете что такое нагрузка, отсюда и ваш вопрос.

Попробую доступно донести свое представление:

Сперва надо определиться что мы будем подразумевать под словом нагрузка, это либо время обработки (сколько времени потребуется для выполнения запросов) либо объем ресурсов (нагрузка на цп и т.д.). Понятно что эти 2 параметра связаны друг с другом, но поверьте, они не связаны прямой зависимостью, поэтому конкретно сейчас мы их разделим. Т.к. запросы у вас простые апдейты, на объем ресурсов они сильно не ударят, поэтому нас интересует время.

Время обработки запроса у вас суммируется из двух частей:

1) Время, которое затрачивает скрипт PHP на отправку запроса и на прием ответа. (1)

2) Время, которое надо самому MySQL серверу для обработки вашего запроса и формирования ответа. (2)

К примерам:

У вас есть цикл с кол-вом итераций например 10, который в теле формирует и отправляет простой запрос (например добавление новой записи). Итого 10 запросов, тут значительное время тратится на (1), т.е. на отправку и на прием ответа. Однако если вы пошлете эти 10 запросов разом, через ;, то тем самым вы сводите время к минимуму в данной ситуации.

Теперь давайте разберем ситуацию, когда вы делаете INSERT + ON DUPLICATE KEY UPDATE (как вам подсказали выше), и отправкой UPDATE через ;. Вообще mysql предоставляет инструменты которые позволяют смотреть, на сколько "удачным" вышел ваш запрос, сколько ресурсов он требует, сколько колонок затрагивает и т.д. К гадалке не ходи, но что-то мне подсказывает что первый вариант будет выполняться дольше, ибо так заложено его конструкцией. Собсна используя простой update через ; вы сократите (2).

Итого:

В целом можно сказать что:

(1) - это кол-во обращений к БД из скриптов, которые вы делаете, когда пользователь обращается к странице. (чем меньше, тем лучше).

(2) - это оптимизация запросов, вот тут уже целая наука, но в вашем случае простой апдейт будет удачным вариантом.

P.S. С индексированными запросами MySQL справляется очень хорошо и годно, способен выдержать большие объемы данных и работать с ними достаточно быстро, так что обращайте на это ваше внимание. Проблемы наблюдаются с JOIN, LIKE, с неиндексированными запросами.

Answer 3
$updateArr = array(
    1 => 'Категория 1'
    2 => 'Категория 2'
    3 => 'Категория 3'
    4 => 'Категория 4'
);
foreach( $updateArr as $categoryId => $categoryName ){
    $sql = "UPDATE `categories` SET `name`='".$categoryName."' WHERE `cat`='".$categoryId."'";
    // sql execute
}

Ну если в цикле не хотите, то, вам сюда

READ ALSO
Не видит класс/файл в Symfony 4

Не видит класс/файл в Symfony 4

Уверена зная PHP стал изучать framework symfony 4Начал с простенькой формы

183
Как в Laravel показать в view, image из local storage?

Как в Laravel показать в view, image из local storage?

Есть jpeg в local storage файле storage/app/MyFyle/1jpg

192
DepDrop поиск по списку

DepDrop поиск по списку

Использую DepDrop от katrikВот мой код:

205