Mysql
 sql >> база данни >  >> RDS >> Mysql

PDO - Вмъкване на голям масив в MySQL база данни

Въпреки че все още се съмнявам, че транзакциите и/или групираните вмъквания са жизнеспособно решение на проблема с използването на ресурсите ви, те все още са по-добро решение от изготвянето на масивни изявления, както предложи Дейв.

Изпробвайте тези и вижте дали помагат.

Следното предполага, че режимът за обработка на грешки на PDO е настроен да хвърля изключения. Например:$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); Ако по някаква причина не можете да използвате режим на изключение, тогава ще трябва да проверите връщането на execute() всеки път и хвърляйте свое собствено изключение.

Единична транзакция:

$sql = $db->prepare("INSERT INTO players (name, level, vocation, world, month, today, online) VALUES (:name, :level, :vocation, :world, :time, :time, :online) ON DUPLICATE KEY UPDATE level = :level, vocation = :vocation, world = :world, month = month + :time, today = today + :time, online = :online");

$db->beginTransaction();
try {
    foreach ($players as $player) {
        $sql->execute([
            ":name" => $player->name,
            ":level" => $player->level,
            ":vocation" => $player->vocation,
            ":world" => $player->world,
            ":time" => $player->time,
            ":online" => $player->online
        ]);
    }
    $db->commit();
} catch( PDOException $e ) {
    $db->rollBack();
    // at this point you would want to implement some sort of error handling
    // or potentially re-throw the exception to be handled at a higher layer
}

Пакетни транзакции:

$batch_size = 1000;
for( $i=0,$c=count($players); $i<$c; $i+=$batch_size ) {
    $db->beginTransaction();
    try {
        for( $k=$i; $k<$c && $k<$i+$batch_size; $k++ ) {
            $player = $players[$k];
            $sql->execute([
                ":name" => $player->name,
                ":level" => $player->level,
                ":vocation" => $player->vocation,
                ":world" => $player->world,
                ":time" => $player->time,
                ":online" => $player->online
            ]);
        }
    } catch( PDOException $e ) {
        $db->rollBack();
        // at this point you would want to implement some sort of error handling
        // or potentially re-throw the exception to be handled at a higher layer
        break;
    }
    $db->commit();
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проектиране на връзки около структура на наследяване

  2. INT(3) колона не изрязва стойността до подходяща дължина и позволява да се вмъкне пълната стойност - MySQL

  3. Таблицата на базата данни не съществува според компилатора на android studio

  4. mysql комбинирани резултати от заявка един до друг

  5. В MySQL:Как да предам име на таблица като аргумент за съхранена процедура и/или функция?