Объединить запрос SELECT и INSERT в один ... возможно? - PullRequest
0 голосов
/ 02 декабря 2011

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

Есть ли способ объединить эти два запроса.

SELECT * FROM tableName WHERE ID='123';
if (NUM_ROWS == 0) {
    INSERT INTO tableName (ID) VALUES (123)
}

По сути, я хочу проверить, существует ли определенная запись, а если нет, я хочу ее создать.Я подумал, что я могу ударить по БД один раз, а не дважды.

Конечная цель - создать строку, только если она не существует первой.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 02 декабря 2011

Если столбец ID является PRIMARY KEY или имеет ограничение UNIQUE, просто попробуйте добавить его с помощью IGNORE, чтобы не было сообщения об ошибке (только предупреждение):

INSERT IGNORE INTO tableName (ID) 
  VALUES (123)

Если это не так, это будет работать в целом:

INSERT INTO tableName (ID)
  SELECT 123
  FROM dual
  WHERE NOT EXISTS
        ( SELECT * 
          FROM tableName 
          WHERE ID = 123
        )
1 голос
/ 02 декабря 2011

Как указывал @uzi, вы можете использовать оператор REPLACE. Однако это удалит запись перед вставкой, и теперь это может быть тем, что вы хотите.

Существует также расширение MySQL INSERT ... ON DUPLICATE KEY UPDATE, но с другой стороны вам придется добавить что-то к предложению обновления в случае, если запись найдена.

Edit: Да, и эти два оператора работают для дублированных уникальных ключей.

1 голос
/ 02 декабря 2011

Вы, наверное, ищете оператор REPLACE

0 голосов
/ 02 декабря 2011

Я склонен использовать простой INSERT IGNORE INTO в этих случаях.Имейте в виду, что это может иметь и другие побочные эффекты, например, другие ошибки преобразования преобразуются в простые предупреждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...