Mysql ГДЕ предложение или php IF условие? - PullRequest
2 голосов
/ 30 июля 2011

Мне часто приходится проверять столбец таблицы перед выполнением обновления, вставки или удаления в mysql. Мне интересно, если это избыточно, потому что предложение mysql WHERE уже является условием.

Пример:

  • Таблица базы данных с именем private_messages хранит личные сообщения для пользователей.

  • Столбец с именем read имеет значение по умолчанию 0 и обновляется до 1 когда пользователь прочитал сообщение.

Какой из двух методов наиболее эффективен и точен для обновления таблицы?

Выполните запрос, верните значение read и используйте условие if:

if (read == 0) //if user did not read message
{
   UPDATE private_messages
   SET read = 1
   WHERE id = 48 //the unique, auto increment index
}

Или просто добавьте предложение WHERE AND к запросу:

UPDATE private_messages
SET read = 1
WHERE id = 48
AND read = 0

и используйте mysql_affected_rows(), чтобы определить, была ли обновлена ​​строка.

Редактировать: Другая ситуация может быть удаление строки, если столбец имеет определенное значение. Должен ли я использовать if условие или where?

Ответы [ 6 ]

4 голосов
/ 30 июля 2011

Я считаю, что MySQL проверяет, совпадает ли новое значение, которое вы пытаетесь вставить, с существующим значением, и выполняет операцию записи, только если они различаются.Так что нет необходимости в утверждении IF.

3 голосов
/ 30 июля 2011

Если у вас уже есть переменная read в памяти (т. Е. Запрашивается для других целей), я бы выбрал первый метод, как если бы сообщение не читалось, вам не нужно запрашивать базу данных.

Если у вас нет переменной read в памяти, используйте второй метод, он будет запрашивать БД только один раз.

3 голосов
/ 30 июля 2011

Первый вариант делает два запроса к базе данных.Второй только один.Вот ваш ответ.

1 голос
/ 30 июля 2011

Вам тоже не нужно. Вы можете просто обновить строку (на основе идентификатора), не проверяя текущее значение read. Это по-прежнему гарантирует, что после выполнения запроса значение read равно 1.

UPDATE private_messages
SET read = 1
WHERE id = 48
1 голос
/ 30 июля 2011

Второй вариант представляется более эффективным, поскольку для него требуется только одно обратное подключение к серверу.Тем не менее, тестирование является единственным способом убедиться.

0 голосов
/ 30 июля 2011

1) Делает запросы 1 или 2 дБ. 2) Всегда делает запросы 2 дБ из-за части mysql_acted_rows ().

...