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 :: ON DUPLICATE KEY UPDATE не обновляет запись [2]

 PHP.SU

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


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

> Без описания
tuareg
Отправлено: 15 Апреля, 2012 - 19:26:29
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


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




Нет. На сколько я его правильно понял...
Есть таблица три поля по 1-му и 2-полю есть составной индекс(уникальный).
Допустим id1==>1 и id2==>1 и третье поле text="бла-бла";
Чтобы обновилось поле text запрос д.б таким
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. "INSERT INTO `table`
  3. (`id1`, `id2`, `text`)
  4. VALUES
  5. (1, 1, 'не бла-бла')
  6. ON DUPLICATE KEY UPDATE
  7. `text` = VALUES (`text`)
  8.  

Так вот, в данном случае поле обновится, потому что обе части (id1 и id2) полностью совпадают.
А если допустим
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. "INSERT INTO `table`
  3. (`id1`, `id2`, `text`)
  4. VALUES
  5. (1, 2, 'не бла-бла')
  6. ON DUPLICATE KEY UPDATE
  7. `text` = VALUES (`text`)
  8.  

То произойдет вставка, т.к id1 совпадет, а вот id2 нет
 
 Top
armancho7777777 Супермодератор
Отправлено: 15 Апреля, 2012 - 19:39:56
Post Id



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


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


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




А я в точность наоборт выходит делал?))
А порядок полей в запросе имеет разницу?

(Отредактировано автором: 15 Апреля, 2012 - 19:44:18)

 
 Top
tuareg
Отправлено: 15 Апреля, 2012 - 19:46:09
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


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




Конечно. Это самое главное. Я для себя уяснил следующее. Индекс что-то типа массива .(составной ассоциативный) Сами понимаете есть массив
$arr1[1][2]=2;
и
$arr2[2][1]=3;
Равенство здесь нет.
P.S я прекрасно понимаю, что это даже близко не подходит под определение И-tree индекса и т.д.
Но мне так проще объяснить.
 
 Top
armancho7777777 Супермодератор
Отправлено: 15 Апреля, 2012 - 19:50:07
Post Id



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


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


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




И каким должен быть порядок?
Как в даблице БД самой, или просто индексное поле в запросе должно быть в начале, и потом все остальные?
 
 Top
tuareg
Отправлено: 15 Апреля, 2012 - 19:59:21
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


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




Вот смотрите. Есть индекс по полям 'id1' и 'id2'.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. ....
  3. UNIQUE KEY `inde` (`id`,`id_2`)
  4.  

Запросы
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. INSERT INTO `test`(`id_2`,`id`,`text`) VALUES (2,1,'wer') ON DUPLICATE KEY UPDATE `text`=VALUES(`text`);
  3.  

и
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. INSERT INTO `test`(`id`,`id_2`,`text`) VALUES (1,2,'wer') ON DUPLICATE KEY UPDATE `text`=VALUES(`text`);
  3.  

Приведут к одинаковому результату-->обновлению. (естественно если уже есть id=1 и id2=2)
А вот запросы
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. INSERT INTO `test`(`id`,`id_2`,`text`) VALUES (2,1,'wer') ON DUPLICATE KEY UPDATE `text`=VALUES(`text`);
  3.  

и
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. INSERT INTO `test`(`id_2`,`id`,`text`) VALUES (1,2,'wer') ON DUPLICATE KEY UPDATE `text`=VALUES(`text`);
  3.  

Приведут к вставке.
P.S Плохой из меня объясняльщик Улыбка
 
 Top
armancho7777777 Супермодератор
Отправлено: 15 Апреля, 2012 - 20:02:53
Post Id



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


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


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




Я имел в виду это порядок)

если будет так:

то выдаёт ошибку

А сам порядок в БД как в первом примере:
`id_2`,`id`,`text`

(Отредактировано автором: 15 Апреля, 2012 - 20:05:13)

 
 Top
tuareg
Отправлено: 15 Апреля, 2012 - 20:05:33
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


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




Нет, не должен. Я сейчас пробовал, все нормально Улыбка
 
 Top
armancho7777777 Супермодератор
Отправлено: 15 Апреля, 2012 - 20:08:26
Post Id



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


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


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




tuareg пишет:
Нет, не должен. Я сейчас пробовал, все нормально Улыбка


А, пардон, порядок добавляемых строк не изменил))
У меня запрос просто динамический, и ситуацию не верно смодулировал)
Ещё раз огромное спасибо tuareg Подмигивание

(Отредактировано автором: 15 Апреля, 2012 - 20:12:40)

 
 Top
tuareg
Отправлено: 15 Апреля, 2012 - 20:14:04
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


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




Да не за что. Я помню сам не одну ночь потратил, чтобы в этой штуковине разобраться.
 
 Top
DlTA
Отправлено: 15 Апреля, 2012 - 23:15:30
Post Id



Постоянный участник


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


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




 
 Top
armancho7777777 Супермодератор
Отправлено: 16 Апреля, 2012 - 06:15:30
Post Id



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


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


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




DlTA пишет:

Если я не ошибаюсь, то REPLACE заменяет строки только по первичному ключу.

(Отредактировано автором: 16 Апреля, 2012 - 06:24:06)

 
 Top
tuareg
Отправлено: 16 Апреля, 2012 - 10:22:17
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


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




Нет будет тоже самое. Просто если INSERT UPDATE делает 2 запроса( Сначала INSERT, и если совпадение то UPDATE), то REPLACE сделает 3 (INSERT->DELETE->INSERT). И при
REPLACE (я не знаю точно!!!), но возможно сработает и каскадное удаление в таблицах типа INNODB. Плюс наверняка сработают и триггеры на DELETE. Т.е в данном случае мне кажется это не совсем оптимальным вариантом.
 
 Top
armancho7777777 Супермодератор
Отправлено: 16 Апреля, 2012 - 12:03:55
Post Id



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


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


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




tuareg пишет:
Т.е в данном случае мне кажется это не совсем оптимальным вариантом.

REPLACE ?
 
 Top
tuareg
Отправлено: 16 Апреля, 2012 - 14:27:06
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


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




armancho7777777 пишет:
tuareg пишет:
Т.е в данном случае мне кажется это не совсем оптимальным вариантом.

REPLACE ?

Да. Зачем выполнять 3 запроса вместо 2.
 
 Top
armancho7777777 Супермодератор
Отправлено: 16 Апреля, 2012 - 15:55:53
Post Id



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


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


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




tuareg пишет:
Да. Зачем выполнять 3 запроса вместо 2.

Да это - то и так понятно ))
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB