Вставка и удаление строк в базе данных MySQL без нескольких запросов - PullRequest
2 голосов
/ 22 марта 2012

Проверьте этот пример, прежде чем читать вопрос - http://www.sqlfiddle.com/#!2/fcf3e/8

Следующие данные взяты из формы, пользователь просто удалил продукт из специального предложения.

Array(
    'special_offer_id' => 1,
    'product_ids' => Array(
        0 => 1,
        0 => 2
    )
)

Изначально я хотел использовать этот запрос ...

REPLACE INTO `foo` VALUES (1, 1), (2, 1);

Но это не приведет к удалению продукта, удаленного пользователем, - только к обновлению остальных.

Так что я вынужден выполнить 2 запроса ...

DELETE FROM `foo` WHERE `special_offer_id` = 1;
INSERT INTO `foo` VALUES (1, 1), (2, 1);

Есть ли лучший способ сделать это без необходимости выполнять 2 запроса?

Пример : http://www.sqlfiddle.com/#!2/fcf3e/8

1 Ответ

1 голос
/ 22 марта 2012

Я не думаю, что в MySQL можно комбинировать операторы DML.Я знаю, что Oracle и MSSQL имеют функцию слияния для этого, но я думаю, что MySQL не имеет этой функции, но я не совсем уверен в этом.придумали другой подход.Если вы перебираете свой массив данных, который присутствует, и выводите результат в 1 переменную и используете delete, чтобы удалить строки, которые не совпадают.недопустимо, поскольку в скрипте оно не указано правильно *

// Declare var and fill with array result
$exists = '';

for ($c = 0; $c < count($array); c++)
{
    if ($c == (count($array) -1))
    {
      $exists .= $array[$c]['product_ids'];
    }
    else
    {
      $exists .= $array[$c]['product_ids'].',';
    }
}

Тогда вместо двух запросов вы можете сделать это с одним

DELETE FROM `foo` WHERE `special_offer_id` NOT IN ('.$exists.');
...