Forum Webscript.Ru

Программирование => Perl => Тема начата: Harvester от 10 Октября 2007, 12:19:11

Название: Много insert / update
Отправлено: Harvester от 10 Октября 2007, 12:19:11
Для insert можно обрабатывать много запросов, типа:
$d=$dbh->prepare("INSERT INTO table (id, podr) VALUES (\'1\', \'$u[1]\'), (\'2\', \'$u[2]\'), (\'3\', \'$u[2]\')");
$d->execute or die $DBI::errstr;

Для update в доке ничего не нашел :(
Запрос типа:
$d=$dbh->prepare("UPDATE SET table pole=\'1\', podr=\'$podr\' WHERE niv4=\'$code\'");
$d->execute or die $DBI::errstr;

Можно ли много запросов в одну строку запихнуть?
Название: Много insert / update
Отправлено: commander от 10 Октября 2007, 15:33:34
Harvester
можно...
Название: Много insert / update
Отправлено: commander от 10 Октября 2007, 15:34:14
Harvester
и ещё...
зачем тебе prepare когда есть do?
Название: Много insert / update
Отправлено: Harvester от 10 Октября 2007, 17:24:49
мну интересует синтаксис этой длиНННой строки:rolleyes:

ps
можно и do.
Название: Много insert / update
Отправлено: vladsu от 11 Октября 2007, 02:36:05
Для sql команд которые ничего, кроме статуса, не возвращают используется do.


foreach () {
   $dbh->do( "INSERT INTO $tableName VALUES ($data)" ) or print "INSERT INTO $tableName VALUES ($data)\\nThe query can\'t be executed: $DBI::errstr\\n";
}

аналогично с UPDATE
Название: Много insert / update
Отправлено: Harvester от 11 Октября 2007, 14:50:47
Пасиб:)
Разницу с do и prepare я знаю, просто копирую из одного в другое, вот и забылваю...

Наверно вопрос не так задал :(

foreach () {} был до этого... там и делается переменная  $all в которой формируется - "(\'1\', \'$u[1]\'), (\'2\', \'$u[2]\'), (\'3\', \'$u[2]\')"..............................)

чтобы потом вставить вместо переменной $all в
$d=$dbh->do("INSERT INTO table (id, podr) VALUES $all ");


Так вот, интересует подобная ерунда для UPDATE с WHERE. Как оно пишется? Чтобы do не стояло внутри foreach.
Название: Много insert / update
Отправлено: vladsu от 12 Октября 2007, 02:18:30
Цитировать
Harvester:
Так вот, интересует подобная ерунда для UPDATE с WHERE. Как оно пишется? Чтобы do не стояло внутри foreach.


Даже если подобное есть использовать не буду и Вам не советую, а настоятельно рекомендую делать и UPDATE и INSERT внутри цикла по одной команде за проход, причины: читабельность, контроль (особенно при отлове ошибок).

[OFF]
>Если ты не один, значит... ты ноль!
ЖЕЛЕЗНАЯ логика :)
[/OFF]
Название: Много insert / update
Отправлено: Harvester от 12 Октября 2007, 11:49:25
vladsu, по одной оч. долго... Тут производительность нужна;)
Обработку более 10 миллионов записей будете ждать полдня... :(

Сейчас экспериментирую кусками, уже почти нащупал решение:D  Для сравнения, по инсертам разница в "по одной" и "по нескольку" - 220 и 30 сек!!!
Название: Много insert / update
Отправлено: commander от 14 Октября 2007, 00:44:42
Harvester
если тебе нужна производетельность... причем тут вообще тогда перл?

используем С++, пишем функции для БД, в концче концов приводим исходный код БД в нужный тебе вид (это конечно только для особо больных)

но блин.. жаловатся на скорость и пользовать Перл - тупость!

Ложка хороша для супа... !
Название: Много insert / update
Отправлено: Harvester от 14 Октября 2007, 14:16:01
Захотелось попробовать пооперировать большими данными. Никто не жалуется, пробую на что он способен вот и все:insane:

А на сколько перл медленнее с++ в данной области?
Название: Много insert / update
Отправлено: commander от 15 Октября 2007, 20:11:30
Harvester
значительнее... поройся... где-то на форуме были бейчмарки..
Название: Много insert / update
Отправлено: Yaroslav от 05 Ноября 2007, 14:52:02
может я не так понял, но "Можно ли много запросов в одну строку запихнуть?"
$dbh->do("UPDATE user SET login=".$dbh->quote($login).", mail=".$dbh->quote($mail).", pass=". $dbh->quote($pass).", code=".$dbh->quote($code)." WHERE login=".$dbh->quote($login)." OR mail=".$dbh->quote($mail));
Название: Много insert / update
Отправлено: WebZ от 24 Ноября 2007, 22:51:22
По поводу prepare и do скажу, что если передаются данные от пользователя, куда лучше делать через prepare и переменные втаскивать в execute для исключения возможных sql-инжектов + это не требует дополнительных проверок на все это дело

По поводу update-  нужно пояснить, то должен делать скрипт. INSERT по умолчанию добавляет одну строку, а update в то время обновляет все строки по "WHERE", т е уже работает со всеми даннами в условиями.
Что является целью?
Обновить разные данные в разных таблицах? (сделать несколько разных update запросов)
Или заменить разные поля с совершенно разными условиями?
Или что-то еще?
Название: Много insert / update
Отправлено: ravshaniy от 29 Ноября 2007, 17:40:09
согласен с Webz. вопрос *зачем это нужно?* весьма актуальный.
Если Вы конешно не человек-тестер.
 
и Примите во внимание, что таблица будет заблокирована на период обновлений

в зависимости от задачи можно было бы продумать и использовать внутреннии утилиты или сервисы репликации бд

а кстати какая бд используется?
множественный инсерт в Мускуле есть. по апдейту тоже согласен с Webz
Название: Много insert / update
Отправлено: Harvester от 29 Ноября 2007, 23:10:45
Решение было найдено, просто надобность пока отпала... вернусь к этому вопросу когда будет время :(  
Меня здесь главным образом интересовала скорость update/insert. База - мускл.

По поводу "зачем это"? Затем, чтобы попробовать загрузить базу - более десятка миллионов записей в табличку под 50 полей. Чтобы потом оперировать данными;) Чисто проверить практику, посомтреть время и тд, чтобы понять стоит ли возиться с такими объемами и какие ресурсы это будет кушать :insane:

2 Yaroslav
см. мой первый пост первый запрос. Там в одном prepare/do "виртуально" формируется несколько update.