Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PDO — Wstaw dużą tablicę do bazy danych MySQL

Chociaż nadal wątpię, czy transakcje i/lub wstawki wsadowe są realnym rozwiązaniem problemu z wykorzystaniem zasobów, nadal są lepszym rozwiązaniem niż przygotowywanie obszernych oświadczeń, jak sugerował Dave.

Daj im szansę i zobacz, czy pomogą.

Poniżej założono, że tryb obsługi błędów PDO jest ustawiony na zgłaszanie wyjątków. Np.:$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); Jeśli z jakiegoś powodu nie możesz użyć trybu wyjątków, musisz sprawdzić zwrot funkcji execute() za każdym razem i zrzuć własny wyjątek.

Pojedyncza transakcja:

$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
}

Transakcje grupowe:

$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. Migracja ASP MVC MsSql do MySQL

  2. Dopasowanie SQL w układzie liter i cyfr bez użycia wyrażeń regularnych

  3. Laravel:lewe zapytanie sprzężenia

  4. MySQL Wybierz Gdzie maksymalna data i maksymalny czas

  5. Jak zapisać wynik zapytania MySQL w zmiennej w c