Как на php выполнить сразу несколько SQL запросов?

Возникла такая проблема. Необходимо сделать UPDATE запрос для нескольких записей в таблице. Точнее сказать для нескольких десятков записей. К примеру таблица заказов (в интернет-магазине) и нужно обновить статусы сразу нескольких заказов (скажем при выгрузке этих статусов из 1с). Соответственно, нужно сделать несколько UPDATE запросов. Используя php функцию mysql_query это можно сделать только так: вызвать ее в цикле нужное количество раз, передав ей UPDATE запрос. В итоге если нужно обновить статусы 1000 заказов, то будет 1000 запросов к бд, что мне видится не очень хорошим решением. Сформировать один большой запрос из UPDATE-ов, разделив из точкой с запятой нельзя, т.к. mysql_query может выполнить только один запрос за раз. Как быть в данной ситуации? Выполняя запрос описанным выше способом я получаю 504-ую ошибку. Не нравится нашему серверу что идет столько запросов в один момент времени.
  • Вопрос задан
  • 9861 просмотр
Решения вопроса 2
@Codebaker
Всё умею, всё могу!
UPDATE your_table SET status=new_status WHERE order_id IN (id,ваших,тысячи,заказов,указанные,через,запятую)

В чем проблема-то? Работайте в рамках теории множеств, уходите от циклов при работе с БД и будет вам счастье.
Ответ написан
nowm
@nowm
Первый способ: сохранить запросы в файл и импортировать этот файл через командную строку. mysql -u user database < /home/username/mysqldump.sql

Второй способ: можно сократить количество запросов немного поменяв логику построения запроса. Вместо

UPDATE `products` SET `status` = 1 WHERE `product_id` = 1;
UPDATE `products` SET `status` = 1 WHERE `product_id` = 2;
-- 
UPDATE `products` SET `status` = 1 WHERE `product_id` = 1000;


можно писать так:

UPDATE `products` SET `status` = 1 WHERE `product_id` IN (1, 2, 3, 4, 5);
UPDATE `products` SET `status` = 2 WHERE `product_id` IN (6, 7, 8, 9);


Update: оу... я так медленно пишу. Когда начинал писать, ни одного ответа ещё не было. ))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если есть уникальный ключ, то можно сделать примерно так:
INSERT INTO `table` (`key_field`, `upd_field1`, `upd_field1`) 
    VALUES ('key1', 'f1_val1', 'f2_val1'), ('key2', 'f1_val2', 'f2_val2')
    ON DUPLICATE KEY UPDATE 
        `upd_field1` = VALUES(`upd_field1`), 
        `upd_field2` = VALUES(`upd_field2`);
Ответ написан
Комментировать
@Graph
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
mysql не поддерживает пакетное обновление. Единственное что можно сделать (допустим для смены статуса заказа) это объединить update запросы по заменяемому значению и выполнить для нескольких id через where in. Еще как вариант удалить все обновляемые записи, сформировать один запрос на вставку и выполнить его (обернув все это в транзакцию).
Ответ написан
Комментировать
Perkov
@Perkov
Я бы копал в cторону mysql stored procedure?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы