Я хочу делать INSERT без записи в БД - PullRequest
1 голос
/ 25 июня 2009

Попытка перевода вышеуказанного вопроса с неродного английского на английский:

Это вопрос о самом быстром способе использования при вставке значения в базу данных, когда значение может уже находиться в базе данных. INSERT потерпит неудачу, когда значение будет там, и UPDATE завершится неудачей, когда его нет. Какой из этих вариантов наиболее желателен?

  • Сначала выберите SELECT и выберите INSERT или UPDATE.
  • Сначала вставьте и используйте UPDATE, если в нем была повторяющаяся ошибка.

Если есть и другие хорошие варианты, кроме вышеперечисленного, научите меня.

Среда использует MySQL 4.1.

Ответы [ 5 ]

11 голосов
/ 25 июня 2009

Если вы хотите сделать это в одном выражении (звучит как то, что вы хотите), я бы рекомендовал использовать синтаксис INSERT ... ON DUPLICATE KEY UPDATE, как показано ниже:

INSERT INTO table (id, someothervalue) VALUES (1, 'hi mom')
  ON DUPLICATE KEY UPDATE someothervalue = 'hi mom';

Первоначальный оператор INSERT будет выполнен, если не существует существующей записи с указанным значением ключа (либо первичным ключом, либо уникальным). Если запись уже существует, выполняется следующий оператор UPDATE (someothervalue = 3).

Это поддерживается во всех версиях MySQL. Для получения дополнительной информации см. Страницу справочного руководства MySQL для INSERT ... ON DUPLICATE KEY UPDATE

0 голосов
/ 25 июня 2009

В PHP я бы сначала сделал UPDATE, а затем использовал mysql_affered_rows (), чтобы проверить, обновлена ​​ли строка. Если нет, то я бы сделал вставку. Обратите внимание, что строка должна быть изменена, чтобы mysql_affered_rows () возвращала результат больше 1.

0 голосов
/ 25 июня 2009

Я бы собрал тестовую базу данных и скрипт для сравнения вариантов.

Просто догадываясь об этом, я считаю, что сначала сделать INSERT, а повторная попытка с UPDATE - в среднем более быстрый путь. Это потому, что если данных еще нет в базе данных, то вы сохранили другой запрос. Если ваши данные чаще находятся в базе данных, сначала выполните ОБНОВЛЕНИЕ и повторите попытку с INSERT, если это не удалось.

Однако ошибка может привести к прерыванию транзакции и необходимости отката. Если это плохо для вас, то сначала вам нужно будет сделать SELECT.

Я не знаю о MySQL, но я знаю, что там, где я работаю, мы используем хранимую процедуру в наших базах данных PostgreSQL, чтобы сделать это. Хранимая процедура выполняет SELECT, а затем вставку или обновление.

0 голосов
/ 25 июня 2009

Или вы можете использовать синтаксис IF EXISTS для проверки наличия строк.

0 голосов
/ 25 июня 2009

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

Честно говоря, звучит так, будто вы хотите знать, что делать, если запись уже существует? или новый?

Поэтому, что вы хотите сделать (в псевдокоде)

$count = SELECT COUNT FROM TABLE WHERE CONDITION;

if($count == 1){
  UPDATE...
} else {
  INSERT...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...