Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Контроль существования записи в БД
 
 автор: alexxspb   (08.03.2009 в 18:31)   письмо автору
 
 

При добавлении записи нужно следить за тем, существует ли такая же запись в БД, и если да - отказывать в добавлении. Сейчас реализовано с помощью двух запросов - первый "SELECT COUNT(*) AS `numrows ..." проверяет кол-во результирующих рядов, и если такая проверка вернула результат 0 (записи не существует), выполняется второй запрос - INSERT.

Все работает корректно, но при двух вставках в разные таблицы получается уже 4 запроса, что, мне кажется, уже не мало. Подскажите, пожалуйста, как поступить - оставить все как есть, или сократить до одного запроса (если он вернет sql ошибку - запись существует)?

  Ответить  
 
 автор: RomanAf   (08.03.2009 в 23:22)   письмо автору
 
   для: alexxspb   (08.03.2009 в 18:31)
 

оставить все как есть

  Ответить  
 
 автор: alexxspb   (09.03.2009 в 12:09)   письмо автору
 
   для: RomanAf   (08.03.2009 в 23:22)
 

Спасибо, так и сделаю.

  Ответить  
 
 автор: Axxil   (09.03.2009 в 12:11)   письмо автору
 
   для: alexxspb   (08.03.2009 в 18:31)
 

-

  Ответить  
 
 автор: Loki   (10.03.2009 в 10:31)   письмо автору
 
   для: alexxspb   (08.03.2009 в 18:31)
 

Сократить до одного запроса:
INSERT IGNORE INTO table ...

Естественно, нужен будет уникальный индекс.

  Ответить  
 
 автор: DJ Paltus   (10.03.2009 в 12:29)   письмо автору
 
   для: Loki   (10.03.2009 в 10:31)
 

А можно поподробнее?
Как нарочно, сегодня сделал то же самое с помощью count() и последующего history.back().
А как этот IGNORE работает? Что можно вернуть юзеру, если записи дублируются?

  Ответить  
 
 автор: Loki   (10.03.2009 в 13:24)   письмо автору
 
   для: DJ Paltus   (10.03.2009 в 12:29)
 

IGNORE не вставляет запись, если такая уже существует (для полей с уникальными индексами). Ну и собственно все: если запись вставилась - у нас есть первичный ключ, если нет - false. На основании этих данных уже можно отчитываться перед клиентом.

  Ответить  
 
 автор: DJ Paltus   (10.03.2009 в 13:34)   письмо автору
 
   для: Loki   (10.03.2009 в 13:24)
 

Век живи, век — учись.
Спасибо )

  Ответить  
 
 автор: Loki   (10.03.2009 в 13:41)   письмо автору
 
   для: DJ Paltus   (10.03.2009 в 13:34)
 

В пятой версии и для UPDATE аналог есть, так что век еще только начинается:)

  Ответить  
 
 автор: alexxspb   (10.03.2009 в 17:52)   письмо автору
 
   для: Loki   (10.03.2009 в 10:31)
 

Тогда встречный вопрос - если с момента соединения до вставки новой записи производятся соединения и обмен информацией с другими хостами, что занимает некоторое время, то ведь можно столкнуться с проблемой, что соединение будет потеряно (ну, например, память кончилась на сервере из-за перегрузки и sql сервер остановился). Иными словами, есть ли еще альтернативные решение?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования