Mysql
 sql >> Base de données >  >> RDS >> Mysql

PDO - Insérer un grand tableau dans la base de données MySQL

Bien que je doute encore que les transactions et/ou les insertions par lots soient une solution viable à votre problème d'utilisation des ressources, elles constituent toujours une meilleure solution que la préparation d'instructions massives comme Dave l'a suggéré.

Essayez-les et voyez s'ils vous aident.

Ce qui suit suppose que le mode de gestion des erreurs de PDO est défini pour lever des exceptions. Ex :$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); Si, pour une raison quelconque, vous ne pouvez pas utiliser le mode Exception, vous devrez vérifier le retour de execute() à chaque fois et lancez votre propre exception.

Transaction unique :

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

Transactions groupées :

$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();
}