Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Как сделать sql-запрос так, чтобы он добавил только те элементы, которых нет в БД?

#php #mysql #sql


Допустим, мне нужно добавить в таблицу term массив слов, которые, возможно, уже есть там.

Можно сделать так - вынуть все значения из term, найти разницу между массивом слов
из БД и массивом, который нужно добавить, после чего закинуть в БД результирующий массив,
но хочется добавить нужные значения за один запрос. 

Можно как-то сделать это?
    


Ответы

Ответ 1



Вам надо объявить уникальный индекс или сделать первичным ключем поле со "словом", чтобы гарантировать, что дубликат не будет создан даже при сбое в скрипте. Затем, в зависимости от контекста задачи, вы можете выбрать: INSERT IGNORE - не-добавление того, что не должно быть добавлено. если вставляете пачкой несколько строк, IGNORE спасет от отмены всей операции; INSERT ON DUPLICATE KEY UPDATE - при обнаружении дубля, сработает "запасной вариант" с обновлением только того, что укажете; REPLACE - фактически делает DELETE и затем INSERT. Cмотрите: https://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-update

Ответ 2



Если добавляется немного слов, то можно так написать: INSERT INTO ... SELECT (формируется список слов) X(word,...) WHERE word NOT IN(...)

Ответ 3



Допустим, есть у нас массив со значениями без ключей - $term = ['a','b','c']: $mysqli = new mysqli('127.0.0.1', 'root', '1111', 'term_base'); for ($i = 0; $i < count($term); $i++){ $check = $mysqli->query("select * from term where `term`='{$term[$i]}' limit 1"); $num = $check->num_rows; if ($num==0){ $ins = $mysqli->query("insert into term values (null, '{$term[$i]}')"); } } Или сделать это следующим образом: $terms = $mysqli->query("select * term from terms"); $terms = $terms->fetch_all(); $diff = array_diff($terms, $term); if ($diff){ for ($i = 0; $i < count($diff); $i++){ $ins = $mysqli->query("insert into term values (null, '{$diff[$i]}')"); } } Можно модифицировать второй вариант и сделать одним запросом: $sql = null; if ($diff){ for ($i = 0; $i < count($diff); $i++){ $sql .= "insert into term values (null, '{$diff[$i]}');"; } $insert = $mysqli->multi_query($sql); }

Ответ 4



Если это UPDATE в БД то зачем мучиться?, если поле повторяется ну и пусть, вы замените все значения, даже если они повторяются. Пример: есть: 1,2,3,4 и вы заменяете: 1,2,3,4,5 вы не добавляете!, вы меняете.

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

Отправить комментарий