Perl DBI insert multiple rows using mysql native multiple insert ability

后端 未结 3 1843
花落未央
花落未央 2021-01-04 09:14

Has anyone seen a DBI-type module for Perl which capitalizes, easily, on MySQL\'s multi-insert syntax

insert into TBL (col1, col2, col3) values (1,2,3),(4,5,6

相关标签:
3条回答
  • 2021-01-04 09:51

    If DBD::mysql supported DBI's execute_for_fetch (see DBI's execute_array and execute_for_fetch) this is the typical usage scenario i.e., you have multiple rows of inserts/updates/deletes available now and want to send them in one go (or in batches). I've no idea if the mysql client libs support sending multiple rows of bound parameters in one go but most other database client libs do and can take advantage of DBI's execute_array/execute_for_fetch. Unfortunately few DBDs actually implement execute_array/execute_for_fetch and rely on DBI implementing it one row at a time.

    0 讨论(0)
  • 2021-01-04 09:52

    There are two approaches. You can insert (?, ?, ?) a number of times based on the size of the array. The text manipulation would be something like:

    my $sql_values = join( ' ', ('(?, ?, ?)') x scalar(@array) );
    

    Then flatten the array for calling execute(). I would avoid this way because of the thorny string and array manipulation that needs to be done.

    The other way is to begin a transaction, then run a single insert statement multiple times.

    my $sql = 'INSERT INTO tbl (col1, col2, col3)';
    $dbh->{AutoCommit} = 0;
    my $sth = $dbh->prepare_cached( $sql );
    $sth->execute( @$_ ) for @array;
    $sth->finish;
    $dbh->{AutoCommit} = 1;
    

    This is a bit slower than the first method, but it still avoids reparsing the statement. It also avoids the subtle manipulations of the first solution, while still being atomic and allowing disk I/O to be optimized.

    0 讨论(0)
  • 2021-01-04 09:52

    Jim, Frezik has it. That is probably the most optimal:

    my $sth = $dbh->prepare( 'INSERT INTO tbl (?, ?, ?)' );
    foreach(@array) { $sth->execute( @{$_} ); }
    $sth->finish;
    
    0 讨论(0)
提交回复
热议问题