Помощник
|
Множество Update в Цикле |
asbury
|
Сообщение
#1
|
||
|
|
||
|
|||
Arks |
23.7.2013, 2:31;
Ответить: Arks
Сообщение
#2
|
|
так для справки, после CASE идет END.
Но это ладно, Вы вероятно не слышали о команде INSERT в качестве замены UPDATE? Да и вообще если речь о тысячах какой может быть insert/update(да еще и через адаптер mysql, Вас что в детстве нацисты пытали долго и мучительно?), ппц.... слышали про команду LOAD DATA? Но все что я выше написал это реальная ситуация. В Вашем же "переписанном" коде, я вижу какой-то бред в цикле без условия WHERE да еще и с ошибками. Пытался сделать множество UPDATE в цикле но СУБД отрубается через несколько тысяч Тут правильнее писать как я выше - "под пытками теряет сознание"Я даже не понял, о чем вообще пост? Давайте я Вам накатаю пример как ее deadlock'ами замучить если уж так хочется! |
|
|
Witu |
23.7.2013, 7:45;
Ответить: Witu
Сообщение
#3
|
|
|
|
|
Arks |
23.7.2013, 11:10;
Ответить: Arks
Сообщение
#4
|
|
Боже, ты всё ещё на людей бочку катишь? Ты великим гением родился? Я ни на кого ничего не качу, я уточняю. Кстати, чему ты удивляешься - доподлинно известно что Николас Уинтон и Ирена Сэндлер реально спасли сотни подобных детей. как это LOAD DATA работает описано здесь А вот применять можно по-разному. Основной смысл массовых вставок заключается в том что LOAD DATA пропускает этап построения плана выполнения запроса(ов), не говоря уже о синтаксическом разборе. Уже затем если хочется UPDATE - делается очень быстрый UPDATE уже на основании пересечения старой и свежезалитой таблиц по какому-либо ключу. Очевидно этот способ оказывается даже быстрее чем множественный UPDATE через INSERT ON DUPLICATE KEY ... |
|
|
Den1xxx |
23.7.2013, 12:26;
Ответить: Den1xxx
Сообщение
#5
|
|
Ты бы к специалисту обратился, который выяснит где же у тебя была та травма в детстве которая заставляет всем в грубом тоне отвечать... По мне так за UPDATE в цикле нужно вообще по рукам бить. А на заданные таким образом вопросы как ТС лучше вообще не отвечать ни в каком тоне. Пусть сначала вопрос сформулирует как надо. asbury, подобного типа вопросы задаются так: 1. Структура таблицы №1 такая-то. 2. Структура таблицы №2 такая-то. 3. Конвертирую таблицу №1 в таблицу №2 таким-то запросом. Не получается. Помогите или укажите на ошибки. А Вы предлагаете исправлять ошибки, не говоря при этом что хотите добиться. Я про конвертирование таблицы догадываюсь, если чо. Может конвертировать и не надо ничего, ХЗ. |
|
|
asbury
|
Сообщение
#6
|
|
Я видел способ update через insert, но как понял там необходимо знать айди.
[PHP]INSERT INTO `table` (id, field) VALUES (1, 1), (2, 12), (3, 0.5) ON DUPLICATE KEY UPDATE field = VALUES(field)[/PHP] Вот кусочек структуры: CREATE TABLE IF NOT EXISTS `prods2` ( `id` int(6) NOT NULL AUTO_INCREMENT, `art` varchar(200) DEFAULT NULL, `artpar` varchar(200) NOT NULL, `name` varchar(200) DEFAULT NULL, `desc` text, `producer` varchar(100) NOT NULL, `cat` int(5) DEFAULT NULL, `price` varchar(10) DEFAULT NULL, `img` varchar(255) NOT NULL, `close` int(1) NOT NULL DEFAULT '0', `nal` int(1) NOT NULL DEFAULT '1', `post` varchar(6) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9133 ; -- -- Дамп данных таблицы `prods2` -- INSERT INTO `prods2` (`id`, `art`, `artpar`, `name`, `desc`, `producer`, `cat`, `price`, `img`, `close`, `nal`, `post`) VALUES (1, 'LEG81266SBL/R', '', 'Кружевной корсет', 'Элегантный кружевной корсет. Состав: 80% нейлон, 20% эластан.', 'Leg Avenue', 105, '2427', 'erosklad/81266.jpg', 0, 1, 'ero'), (2, '', 'LEG81266SBL/R', 'Кружевной корсет', 'S', '', 105, '2427', '', 0, 1, 'ero'), (3, '', 'LEG81266MBL/R', 'Кружевной корсет', 'M', '', 105, '2427', '', 0, 1, 'ero'), (4, '', 'LEG81266LBL/R', 'Кружевной корсет', 'L', '', 105, '2427', '', 0, 1, 'ero'); У меня массив с обновлением наличия товара. $_array = array( '0' => array( 'name' => 'Туфли белые Медсестра', 'art' => '3194', 'artpar' => '', 'img' => 'stripmag/3194.jpg', 'producer' => 'Erolanta', 'desc' => 'Белые туфли медсестры из кожзаменителя, стелька кожаная. Материал: лакированная кожа Высота платформы: 4 см. Высота каблука: 14 см. Стелька: искусственная кожа Декор: бело-красный из прошитой лакированной кожи. Каблук и платформа обтянуты лакированной кожей в цвет туфель.', 'cat' => '73', 'col' => '10', 'price' => '2618.00'), '1' => array( 'name' => 'Туфли белые Медсестра', 'art' => '', 'artpar' => '3194', 'img' => '', 'producer' => '', 'desc' => 'белый - 36', 'cat' => '73', 'col' => '10', 'price' => '2618.00'), '2' => array( 'name' => 'Туфли белые Медсестра', 'art' => '', 'artpar' => '3194', 'img' => '', 'producer' => '', 'desc' => 'белый - 37', 'cat' => '73', 'col' => '10', 'price' => '2618.00'), Собственно в базе - 9000 товаров. В массиве 1000-9000 по наличию. Делал вот так: [PHP]$str = "UPDATE `prods2` SET `nal`= CASE "; foreach($_array as $val) { $art = trim($val['art']); $artpar = trim($val['artpar']); $desc = trim($$val['desc']); $col = trim($val['col']); $price = trim($val['price']); $img = trim($val['img']); $name = trim($val['name']); $str .= "WHEN `post`='strip' AND `name`='$name' AND `img`='$img' AND `desc`='$desc' AND `art`='$art' AND `artpar`='$artpar' THEN '$col'"; } $str .= " ELSE `field` END"; $result = mysql_query($str); if ($result == 'true') {echo "Обновлено кол-во у всего списка";} else {echo "НЕ ОБНОВИЛОСЬ ".mysql_error()."<br />";}[/PHP] Подскажите как быть в конкретном случае? Попробывал через инсерт, как понял и снова понял с ошибкой: [PHP]$str2 = "INSERT INTO `prods2` (`art`,`artpar`,`name`,`desc`,`producer`,`cat`,`price`,`img`,`nal`,`post`) VALUES "; foreach($_array as $val) { $art = trim($val['art']); $artpar = trim($val['artpar']); $name = trim($val['name']); $desc = trim($$val['desc']); $producer = trim($$val['producer']); $cat = trim($$val['cat']); $price = trim($val['price']); $img = trim($val['img']); $col = trim($val['col']); $str2 .= "('$art','$artpar','$name','$desc','$producer','$cat','$price','$img','$col','strip'), "; } $str2 .= " ON DUPLICATE KEY UPDATE `nal` = VALUES('nal');"; $result = mysql_query($str2); if ($result == 'true') {echo "Обновлено кол-во у всего списка";} else {echo "НЕ ОБНОВИЛОСЬ ".mysql_error()."<br />";} [/PHP] |
|
|
Den1xxx |
23.7.2013, 16:36;
Ответить: Den1xxx
Сообщение
#7
|
|
|
|
|
Witu |
23.7.2013, 17:05;
Ответить: Witu
Сообщение
#8
|
|
|
|
|
Arks |
23.7.2013, 21:13;
Ответить: Arks
Сообщение
#9
|
|
Подскажите как быть в конкретном случае? CREATE TABLE nal_update ( `id` CHAR(32) NOT NULL COMMENT 'md5(name, img, desc, art, artpar)', `nal` int(1) NOT NULL DEFAULT 1, PRIMARY KEY USING HASH (id) ) ENGINE = MEMORY; /*PK(id) сделан если все же хочется заменить IGNORE на INSERT ON DUPLICATE KEY если например предполагается высокая конкурентность, в данном случае он особо и не нужен*/ INSERT IGNORE INTO `nal_update` (id, nal) VALUES (MD5($name1.$img1.$desc1.$art1.$artpar1), $nal1), (MD5($name2.$img2.$desc2.$art2.$artpar2), $nal2); UPDATE prods2, nal_update set prods2.nal = nal_update.nal WHERE nal_update.id = MD5(CONCAT(prods2.name, prods2.img, prods2.desc, prods2.art, prods2.artpar)); TRUNCATE TABLE nal_update; полагаю идея ясна? Кстати поле nal с типом int(1) в Вашей таблице это даже для меня очень загадочно выглядит :) там точно именно такой тип стоит использовать? а то что это LOAD DATA INFILE не смущает??? в смысле что загружаются данные из ФАЙЛА А должно? Здесь его использовать смысла нет, но если бы там не int(1) был а BLOB'ы пачкой вы бы их тоже в мульти-INSERT их запихнули и выставили max_allowed_packet в n~ ГБ? Кстати есть еще и LOAD DATA OUTFILE(ну это уж так, стёб).. P.S. я так понимаю тырки автора связаны с непониманием того как работает INSERT ON DUPLICATE KEY UPDATE. Он работает так - при попытке вставить новую запись, а конкретно значение в поле таблицы, ограниченное уникальным индексом у mysql'я происходит взрыв мозга и вылетает исключение 'Duplicate entry for key <key_name>'. Соответственно данная мини-транзактюшечка на вставку записи откатывается. В таблице могут быть много уникальных индексов на разных колонках, исключение может произойти на любом. Иногда в запросе присутствуют инструкции которые говорят mysql'ю как же быть чтобы не становиться злюкой. IGNORE - исключение просто не отдается клиенту. ON DUPLICATE KEY UPDATE - взять запись, значение уникального индекса которой вызвало конфликт и заапдейтить ее новой инфой вместо вставки новой записи. Ну есть еще такая хитрая штука как REPLACE(вместо INSERT) - она вставляет новую запись всегда, а если на уникальном индексе вылетает исключение - старая конфликтующая запись просто предварительно удаляется, соответственно поэтому REPLACE всегда обновляет счетчик автоинкремента у таблицы имеющий автоинкрементное поле. |
|
|
Witu |
23.7.2013, 21:51;
Ответить: Witu
Сообщение
#10
|
|
Arks, ОКЕЙ слабо исправить проблему автора используя LOAD DATA? и так что бы не создавались никакие дополнительные файлы на сервере?
|
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Статейные прогоны, цена от 20$ ▶ опыт и качество! Множество сайтов на различных cms. В базе более 700 сайтов. |
332 | Nonsys | 440982 | 18.5.2022, 12:47 автор: Nonsys |
|
Продам множество шаблонов WordPress на разные темы | 1 | ctgk | 5111 | 13.4.2017, 21:35 автор: -Tenar1- |
|
Продажа игрового макета (множество страниц) | 0 | Almir73 | 919 | 13.6.2013, 21:51 автор: Almir73 |
|
Вывод в цикле значений из базы! | 3 | Panich | 4257 | 27.5.2011, 16:14 автор: -Panich- |
|
Как вывести в коде страницы множество ссылок одной строкой | 1 | villipuk | 6454 | 3.11.2010, 1:15 автор: -ZhukV- |
Текстовая версия | Сейчас: 19.4.2024, 12:07 |