Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > вставка большого числа записей + транзакции + PDO


Автор: getme 14.7.2009, 18:46
Как мне вставить скажем сто записей в одну таблицу и если все успешно проапдейтить 1ну запись с другой таблицы
все это должно быть на уровне транзакций.
должно быть два запроса как я понимаю, вопрос как выполнить вставку ста строк одним запросом?

в питоне помню есть чтото было mysql_insеrt_many( ..)
в пхп/PDO есть чтонибудь подобное?

Спасибо заранее

Автор: Nigel 14.7.2009, 21:46
А не проще воспользоваться LOAD DATA?
Есть вариант через LOCK TABLES ... (т.н. псевдотранзакции).
В пхп недавно обновили библиотеку для работы с mysql; раньше нельзя было использовать хранимки, транзакции, используя mysql_. Сейчас на новых версиях вроде поддерживается. Обычно используют mysqli для этих целей.
Код

$mysqli->autocommit(FALSE);
$mysqli->query(...);
$mysqli->query(...);
$mysqli->commit();

Смотрите сами, как сделать. Я бы выбрал 1-й вариант.

Автор: ksnk 14.7.2009, 22:06
Цитата(getme @  14.7.2009,  18:46 Найти цитируемый пост)
должно быть на уровне транзакций

http://dev.mysql.com/doc/refman/5.1/en/commit.html
Цитата(getme @  14.7.2009,  18:46 Найти цитируемый пост)
как выполнить вставку ста строк одним запросом?

http://dev.mysql.com/doc/refman/5.1/en/insert.html

Автор: getme 15.7.2009, 09:05
ссори но это все не то, т.е insert ... values (...),(...),... это понятно
но я имел в виду ПДО и prepared staements

т.е вот что то

Код

$conn->beginTransaction();
try {
 $conn->query("INSERT INTO tabl1 (a,b)(?, ?)");
 $conn->execute(array( array(1,2),  array(2,3), array(3,4) ))
 $conn->query("UPDATE table2 SET com=1");
 $conn->execute(array());
 $conn->commit();
}
catch(PDOException $e) {
 $conn->rollBack();
}


но судя по поискам такого в пхп нет, жаль.

Автор: getme 15.7.2009, 19:55
неподумал что можно сделать так

Код

$conn->beginTransaction();
try {
 foreach ( ..)
 {
  $conn->query("INSERT INTO tabl1 (a,b)(?, ?)");
  $conn->execute(array( ..))
 }
 $conn->query("UPDATE table2 SET com=1");
 $conn->execute(array());
 $conn->commit();
}
catch(PDOException $e) {
 $conn->rollBack();
}

Автор: youri 17.7.2009, 09:44
лучше в цикле создать запрос, а послать его по завершении цикла, а не посылать кучу запросов
p.s. возможно лучше использовать LOAD DATA INFILE, быстрее работает

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)