Как вставить новые строки, если они не существуют, и удалить, если они существуют?

#php #mysql #sql

#php #mysql #sql

Вопрос:

У меня есть массив данных, который поступает из пользовательского ввода (выберите выпадающий список). Выпадающий список содержит некоторые значения по умолчанию, и пользователь может выбрать больше или отменить выбор значений по умолчанию (данные базы данных). После отправки я хочу проверить, есть ли они в БД, и пользователь отменяет выбор из выпадающего списка, или если пользователь выбрал больше и вставил эти.

 $sql_insert_update_locations = $dbi->prepare("INSERT INTO my_items_table (user_id,location_id) VALUES (?,?) ON DUPLICATE KEY UPDATE user_id=VALUES(user_id), location_id=VALUES(location_id)");

 foreach ($location_id as $loc_id) {
    $sql_insert_update_locations->bind_param("ii", $user_id, $loc_id);
    $sql_insert_update_locations->execute();
 }
  

приведенный выше запрос вставляет / обновляет вновь выбранные, но не проверяет, было ли что-либо отменено, чтобы удалить их из БД.

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

1.Не стоит отвечать, но я бы создал новый массив, выбрав строки БД перед обновлением, используйте array_diff() php.net/manual/en/function .array-diff.php чтобы найти элементы в этом массиве, которые не существуют в новом выделении, и написать запрос на удаление для повторной итерации из результирующего массива

2. @TCooper итак, в основном напишите два запроса: один для вставки / обновления и один для удаления, верно?

3. Я не знаю ни одной rdbms, которая объединяла бы insert / update / delete в один оператор sql, поэтому вам нужен другой запрос для удаления записей.

4. Хотя это ваш код, и вы можете делать все, что хотите, такие имена переменных, как $sql_insert_update_locations , действительно, слишком подробны и значительно сокращают ваш код, что делает его намного сложнее для чтения. Что-то вроде $stmt более обычного.

5. @Shadow . , , На самом деле, я бы сказал, что больше баз данных, чем не поддерживают merge , что делает именно то, что запрашивает OP. Однако MySQL не является одной из этих баз данных.