X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Множество Update в Цикле
asbury
asbury
Topic Starter сообщение 23.7.2013, 1:33; Ответить: asbury
Сообщение #1


Пытался сделать множество UPDATE в цикле но СУБД отрубается через несколько тысяч. Тогда стал искать способы собрать запрос, а потом одним коннектом его выполнить. Но вот не пойму в чем лажаю.

Был скрипт:
[PHP]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']);

$result = mysql_query("UPDATE `prods2` SET `nal`='$col' WHERE `post`='strip' && `art`='$art' && `artpar`='$artpar' && `img`='$img'");
if ($result == 'true') {echo "Обновлено кол-во у <strong>".$art."</strong> ".$col."<br />";}
else {echo "НЕ ОБНОВИЛОСЬ ".mysqli_error()."<br />";}
}[/PHP]

Я его переписал:
[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' THEN '$col'
";
}
$str .= "ELSE `field`";
$result = mysql_query($str);
if ($result == 'true') {echo "Обновлено кол-во у всего списка";}
else {echo "НЕ ОБНОВИЛОСЬ ".mysql_error()."<br />";}[/PHP]

Выдается ошибка:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5434
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 23.7.2013, 2:31; Ответить: Arks
Сообщение #2


так для справки, после CASE идет END.
Но это ладно, Вы вероятно не слышали о команде INSERT в качестве замены UPDATE?
Да и вообще если речь о тысячах какой может быть insert/update(да еще и через адаптер mysql, Вас что в детстве нацисты пытали долго и мучительно?), ппц.... слышали про команду LOAD DATA?
Но все что я выше написал это реальная ситуация.

В Вашем же "переписанном" коде, я вижу какой-то бред в цикле без условия WHERE да еще и с ошибками.

Пытался сделать множество UPDATE в цикле но СУБД отрубается через несколько тысяч
Тут правильнее писать как я выше - "под пытками теряет сознание"

Я даже не понял, о чем вообще пост? Давайте я Вам накатаю пример как ее deadlock'ами замучить если уж так хочется!
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Witu
Witu
сообщение 23.7.2013, 7:45; Ответить: Witu
Сообщение #3


(Arks @ 23.7.2013, 05:31) *
LOAD DATA

надо было до конца читать как это работает
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 23.7.2013, 11:10; Ответить: Arks
Сообщение #4


(alexdrob @ 23.7.2013, 05:46) *
Боже, ты всё ещё на людей бочку катишь? Ты великим гением родился?

Я ни на кого ничего не качу, я уточняю. Кстати, чему ты удивляешься - доподлинно известно что Николас Уинтон и Ирена Сэндлер реально спасли сотни подобных детей.

как это LOAD DATA работает описано здесь А вот применять можно по-разному. Основной смысл массовых вставок заключается в том что LOAD DATA пропускает этап построения плана выполнения запроса(ов), не говоря уже о синтаксическом разборе. Уже затем если хочется UPDATE - делается очень быстрый UPDATE уже на основании пересечения старой и свежезалитой таблиц по какому-либо ключу. Очевидно этот способ оказывается даже быстрее чем множественный UPDATE через INSERT ON DUPLICATE KEY ...
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Den1xxx
Den1xxx
сообщение 23.7.2013, 12:26; Ответить: Den1xxx
Сообщение #5


(alexdrob @ 23.7.2013, 05:46) *
Ты бы к специалисту обратился, который выяснит где же у тебя была та травма в детстве которая заставляет всем в грубом тоне отвечать...

По мне так за UPDATE в цикле нужно вообще по рукам бить. А на заданные таким образом вопросы как ТС лучше вообще не отвечать ни в каком тоне.
Пусть сначала вопрос сформулирует как надо.

asbury, подобного типа вопросы задаются так:
1. Структура таблицы №1 такая-то.
2. Структура таблицы №2 такая-то.
3. Конвертирую таблицу №1 в таблицу №2 таким-то запросом. Не получается. Помогите или укажите на ошибки.

А Вы предлагаете исправлять ошибки, не говоря при этом что хотите добиться.
Я про конвертирование таблицы догадываюсь, если чо.
Может конвертировать и не надо ничего, ХЗ.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
asbury
asbury
Topic Starter сообщение 23.7.2013, 14:19; Ответить: 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
Den1xxx
сообщение 23.7.2013, 16:36; Ответить: Den1xxx
Сообщение #7


(asbury @ 23.7.2013, 17:19) *
Подскажите как быть в конкретном случае?

А на какой раз все-таки услышим, чего хотите добиться?
Структура — до и структура которая должна быть — после запроса?
Подозреваю что все проблемы одним простым запросом решатся, типа:
INSERT INTO `prods2` SELECT * FROM `prods1`;
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Witu
Witu
сообщение 23.7.2013, 17:05; Ответить: Witu
Сообщение #8


(Arks @ 23.7.2013, 14:10) *
как это LOAD DATA работает описано здесь А вот применять можно по-разному.

а то что это LOAD DATA INFILE не смущает??? в смысле что загружаются данные из ФАЙЛА
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
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) в Вашей таблице это даже для меня очень загадочно выглядит :) там точно именно такой тип стоит использовать?

(HTMLandPHP @ 23.7.2013, 20:05) *
а то что это 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
Witu
сообщение 23.7.2013, 21:51; Ответить: Witu
Сообщение #10


Arks, ОКЕЙ слабо исправить проблему автора используя LOAD DATA? и так что бы не создавались никакие дополнительные файлы на сервере?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыСтатейные прогоны, цена от 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-


 



RSS Текстовая версия Сейчас: 19.4.2024, 12:07
Дизайн