Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Странное поведение UPDATE

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Два разных UPDATE дают один результат
Viper
Отправлено: 10 Октября, 2011 - 16:27:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Есть массив
CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [cd_station_adr] => 0.010
  3.     [cd_strafe_01] => 1
  4.     [cd_phone] => 3199
  5.     [cd_port] => 1-1-67-00
  6.     [cd_line_adr] => 1.470
  7.     [cd_strafe_02] => 2
  8.     [cd_username] => АТС
  9.     [cd_user] => Модем
  10.     [cd_desc] => 1 разъём
  11.     [cd_state] => on
  12.     [id] => 1
  13.     [cd_city] => 1
  14.     [cd_place] => 1
  15.     [cd_psb] => 1
  16. )


Есть 2 запроса
CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE `#__cross_crossdata`
  2.  SET `cd_station_adr` = '0.010', `cd_phone` = '3199', `cd_port` = '1-1-67-00', `cd_line_adr` = '1.470', `cd_user` = 'Модем', `cd_username` = 'АТС', `cd_desc` = '1 разъём', `cd_strafe_01` = '1', `cd_strafe_02` = '2'
  3.  WHERE `cd_id` = '1'

CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE `#__cross_crossdata`
  2.  SET `cd_station_adr` = '1.470', `cd_phone` = '3199', `cd_port` = '1-1-67-00', `cd_line_adr` = '0.010', `cd_user` = 'Модем', `cd_username` = 'АТС', `cd_desc` = '1 разъём', `cd_strafe_01` = '1', `cd_strafe_02` = '2'
  3.  WHERE `cd_line_adr` = '1.470'


Когда скрипт их выполняет почему-то строки отобранные по WHERE становятся абсолютно одинаковыми. Такое впечатление что в 2-ом UPDATE условие WHERE просто игнорируется.

В чем затык? Может я туплю?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
IronHawk
Отправлено: 10 Октября, 2011 - 16:44:27
Post Id



Новичок


Покинул форум
Сообщений всего: 61
Дата рег-ции: Авг. 2011  


Помог: 1 раз(а)




Viper пишет:
В чем затык?

Чисто для себя хочу уточнить, а какой тип поля cd_line_adr?
 
 Top
EuGen Администратор
Отправлено: 10 Октября, 2011 - 17:30:17
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Этими двумя запросами Вы обновите одну и ту же строку - как минимум, а так же все те, что попадают под второе условие - как максимум.
Первым запросом Вы обновляете в числе прочего
`cd_line_adr` = '1.470'
а во втором запросе Вы обновляете все, где
WHERE `cd_line_adr` = '1.470'
- стало быть, если первый запрос исполняется раньше второго, оба затронут одну и ту же строку по очереди (и второй, вероятно, затронет еще какие-либо строки).

Да, кстати, не заключайте значения для целочисленных и вещественных значений в кавычки - лишняя работа для БД получается.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Champion Супермодератор
Отправлено: 10 Октября, 2011 - 18:00:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




EuGen пишет:
если первый запрос исполняется раньше первого
Думаю, такое не часто случается) А вот первый раньше второго - весьма вероятно)
 
 Top
Viper
Отправлено: 11 Октября, 2011 - 07:26:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




IronHawk пишет:
а какой тип поля cd_line_adr?
VARCHAR(12)
EuGen пишет:
Да, кстати, не заключайте значения для целочисленных и вещественных значений в кавычки - лишняя работа для БД получается.
т.е. 1.5548974 можно в кавычки не заключать?
EuGen пишет:
Этими двумя запросами Вы обновите одну и ту же строку - как минимум, а так же все те, что попадают под второе условие - как максимум.
все. уже увидел. Щас попробую исправить. Тупеж полный чет у меня.

Попутно спрошу про поиск по таким данным. Нужны ли индексы для всех приведенных колонок если в базе может быть несколько млн. строк и поиск ведется одновременно по всем столбцам?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
EuGen Администратор
Отправлено: 11 Октября, 2011 - 10:14:13
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Champion
И то верно.
Viper пишет:
т.е. 1.5548974 можно в кавычки не заключать?

Я бы сказал даже - нужно не заключать

Viper пишет:
Нужны ли индексы для всех приведенных колонок

Только по тем колонкам, данные для которых дискретны и индекс по которым будет иметь приемлимую мощность множества значений ключа (т.н. cardinality)
Скажем, по INT, CHAR, DATE и ENUM - полям индекс построится в большинстве случаев хороший, по VARCHAR - тоже хороший, но еще лучше если его (индекса) длину ограничить, а вот для DATETIME, TIMESTAMP или тем более FLOAT/DOUBLE полей индекс будет не только бесполезен, но скорее всего и вреден.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB