Forum Webscript.Ru
Программирование => Perl => Тема начата: 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;
Можно ли много запросов в одну строку запихнуть?
-
Harvester
можно...
-
Harvester
и ещё...
зачем тебе prepare когда есть do?
-
мну интересует синтаксис этой длиНННой строки:rolleyes:
ps
можно и do.
-
Для 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
-
Пасиб:)
Разницу с 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.
-
Harvester:
Так вот, интересует подобная ерунда для UPDATE с WHERE. Как оно пишется? Чтобы do не стояло внутри foreach.
Даже если подобное есть использовать не буду и Вам не советую, а настоятельно рекомендую делать и UPDATE и INSERT внутри цикла по одной команде за проход, причины: читабельность, контроль (особенно при отлове ошибок).
[OFF]
>Если ты не один, значит... ты ноль!
ЖЕЛЕЗНАЯ логика :)
[/OFF]
-
vladsu, по одной оч. долго... Тут производительность нужна;)
Обработку более 10 миллионов записей будете ждать полдня... :(
Сейчас экспериментирую кусками, уже почти нащупал решение:D Для сравнения, по инсертам разница в "по одной" и "по нескольку" - 220 и 30 сек!!!
-
Harvester
если тебе нужна производетельность... причем тут вообще тогда перл?
используем С++, пишем функции для БД, в концче концов приводим исходный код БД в нужный тебе вид (это конечно только для особо больных)
но блин.. жаловатся на скорость и пользовать Перл - тупость!
Ложка хороша для супа... !
-
Захотелось попробовать пооперировать большими данными. Никто не жалуется, пробую на что он способен вот и все:insane:
А на сколько перл медленнее с++ в данной области?
-
Harvester
значительнее... поройся... где-то на форуме были бейчмарки..
-
может я не так понял, но "Можно ли много запросов в одну строку запихнуть?"
$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));
-
По поводу prepare и do скажу, что если передаются данные от пользователя, куда лучше делать через prepare и переменные втаскивать в execute для исключения возможных sql-инжектов + это не требует дополнительных проверок на все это дело
По поводу update- нужно пояснить, то должен делать скрипт. INSERT по умолчанию добавляет одну строку, а update в то время обновляет все строки по "WHERE", т е уже работает со всеми даннами в условиями.
Что является целью?
Обновить разные данные в разных таблицах? (сделать несколько разных update запросов)
Или заменить разные поля с совершенно разными условиями?
Или что-то еще?
-
согласен с Webz. вопрос *зачем это нужно?* весьма актуальный.
Если Вы конешно не человек-тестер.
и Примите во внимание, что таблица будет заблокирована на период обновлений
в зависимости от задачи можно было бы продумать и использовать внутреннии утилиты или сервисы репликации бд
а кстати какая бд используется?
множественный инсерт в Мускуле есть. по апдейту тоже согласен с Webz
-
Решение было найдено, просто надобность пока отпала... вернусь к этому вопросу когда будет время :(
Меня здесь главным образом интересовала скорость update/insert. База - мускл.
По поводу "зачем это"? Затем, чтобы попробовать загрузить базу - более десятка миллионов записей в табличку под 50 полей. Чтобы потом оперировать данными;) Чисто проверить практику, посомтреть время и тд, чтобы понять стоит ли возиться с такими объемами и какие ресурсы это будет кушать :insane:
2 Yaroslav
см. мой первый пост первый запрос. Там в одном prepare/do "виртуально" формируется несколько update.