sql >> Database teknologi >  >> RDS >> Mysql

Arbejde med filpointere på en csv

  1. Er fgets() den bedste at bruge til dette? Det er en fin måde at gøre det på. En anden mulighed er at læse hele filen ind i et array med file() , og derefter loop over arrayet med foreach() .

  2. Behøver jeg at indsætte et tilbagekald? Nej. Bare udfør forespørgslen efter at have læst hver batch af linjer fra filen.

  3. Hvor skal man begynde? Når tælleren når batchstørrelsen, skal du udføre forespørgslen. Sæt derefter tælleren tilbage til 0 og sæt forespørgselsstrengen tilbage til den oprindelige værdi. Til sidst, i slutningen af ​​løkken skal du udføre forespørgslen med de resterende værdier (medmindre filstørrelsen var et nøjagtigt multiplum af batchstørrelsen, i hvilket tilfælde der ikke vil være noget tilbage).

$batch_size = 100;
$counter = 0;

//instead of executing query one by one,
//let us prepare 1 SQL query that will insert all values from the batch

$sql_prefix ="INSERT INTO workorderstest(id,parentid,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10) VALUES ";
$values = "";

while (($line = fgets($handle)) !== false) {
    $values .= "($line),";
    $counter++;
    if ($counter == $batch_size) {
        $values = substr($values, 0, strlen($values) - 1);
        $conn->query($sql_prefix . $values) or die($conn->error);
        $counter = 0;
        $values ="";
    }
}
if ($counter > 0) { // Execute the last batch
    $values = substr($values, 0, strlen($values) - 1);
    $conn->query($sql_prefix . $values) or die($conn->error);
}


  1. Kører Total-Order By Date i SQLite

  2. Kan ikke indsætte Unicode ved hjælp af cx-Oracle

  3. Udforskning af Postgres-datoformater og deres forskellige funktioner

  4. SQL Server Failover Cluster Installation -2