Можно ли условно вставить несколько значений в таблицу MySQL одним оператором? - PullRequest
1 голос
/ 25 февраля 2012

Я прочитал этот вопрос , который выдвигает на первый план решение условно вставить значения в таблицу, если они еще не существуют. Мой вопрос: можно ли условно вставить несколько значений одновременно.

Например, скажем, у меня есть таблица, которая содержит только имена пользователей (это бессмысленная таблица, но давайте будем проще). Содержимое таблицы выглядит так:

matthew  20
mark     24
luke     25
john     56
buddy    68

Пользователь вводит jimmy 34, mark 25 и bobby 54 в веб-форму и отправляет их, и я хотел бы проверить, существуют ли эти три значения в таблице, и вставить те, которые отсутствуют в одном выражении. Да, для этого примера я предполагаю, что имена уникальны.

Вот парафраз фрагмента кода из вопроса, с которым я связан, адаптированный к этому примеру:

INSERT INTO users(name) 
SELECT 'jimmy'
    FROM dual
    WHERE NOT EXISTS (SELECT * FROM users
                         WHERE user = 'jimmy')

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

Второй вопрос: это мудро? Я знаю, что уменьшение количества запросов желательно, но стоит ли оно здесь? Должен ли я просто установить цикл for и цикл, попеременно проверяя, существует ли значение и вставляя, если его нет?

Спасибо за любую помощь.

Извините, у меня нет кода, который я пытался показать сам, я даже не уверен, что здесь попробовать.

Обновление: добавлен дополнительный столбец в таблицу. Я хотел, чтобы все было просто, но мне нужны два столбца, чтобы проиллюстрировать тот факт, что удаление строки, а затем вставка или обновление - это не то, что мне нужно, поскольку они предпочтительнее для ввода пользователя по сравнению с тем, что уже есть в таблице.

Ответы [ 3 ]

0 голосов
/ 25 февраля 2012

Я не большой в программировании (особенно в php), но вы можете разобрать строку на отдельные имена и затем выполнить цикл?

что-то вроде (надеюсь, синтаксис несколько правильный)

$names = split(" ", $user_names);
for ($i=0; $i<count($names); i++)
 {
  //sql query check - add new name function
  function_sql_query($names[$i]);
 }

Кроме того, вы можете добавить правила в свою SQLDBMS, чтобы запретить повторные записи в этом атрибуте и добавлять только уникальные записи;этот процесс будет поддерживаться СУБД

0 голосов
/ 25 февраля 2012

См. INSERT IGNORE в сочетании с УНИКАЛЬНЫМ КЛЮЧОМ в рассматриваемом поле.

При сбое ограничения уникального ключа вся строка игнорируется.

ALTER TABLE users ADD UNIQUE KEY `name` (`name`);
INSERT IGNORE INTO `users` (`name`, `age`) 
  VALUES ("jimmy", 22), ("bob", 45), 
         ("luke", 300), ("john", 456);

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

0 голосов
/ 25 февраля 2012

Вы можете использовать замену MySQL

http://dev.mysql.com/doc/refman/5.0/en/replace.html

ИЛИ ВСТАВИТЬ ... НА КЛЮЧЕВОМ КЛЮЧЕ ОБНОВЛЕНИЕ

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...