Perl很多将参数插入到mysql数据库中

时间:2015-08-19 17:19:42

标签: mysql sql perl sql-insert dbi

我目前有perl的代码,如下所示:

@valid = grep { defined($column_mapping{ $headers[$_] }) } 0 .. $#headers;

...

my $sql = sprintf 'INSERT INTO tablename ( %s ) VALUES ( %s )',
  join( ',', map { $column_mapping{$_} } @headers[@valid] ),
  join( ',', ('?') x scalar @valid);
my $sth = $dbh->prepare($sql);

...

my @row = split /,/, <INPUT>; 
$sth->execute( @row[@valid] );

(从mob&#39; s answer转到上一个问题。)

这基本上是从csv数据动态构建一个sql insert语句,只允许选择带有我的列映射的正确头文件的csv数据。

我一直在寻找有关如何同时执行包含多行数据的插入语句的示例。

我的perl脚本需要运行几亿个插入语句,并且一次执行一个看起来非常慢,特别是因为我运行它的服务器只有6GB的内存和缓慢的Internet连接。

有没有一种方法可以一次上传超过1行的数据?那么一个插入语句上传可能是50行,或者一次上传100行?我无法找到perl DBI的方法。

2 个答案:

答案 0 :(得分:2)

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

如前所述,那么你可以将它弄平。

答案 1 :(得分:0)

您可以使用与常规SQL中相同的语法一次插入多行,但您需要使用Perl正确构建INSERT状态。 Perl的slice()可以帮助你:

假设您有7行数据,并希望将它们插入3行的块中。 &#34;定期&#34; SQL就是这样:

insert into T (col1, col2) values ( 1, 2), ( 3, 4), ( 5, 6);
insert into T (col1, col2) values ( 7, 8), ( 9,10), (11,12);
insert into T (col1, col2) values (13,14);

假设你的perl结构是这样的:

my $values = [ [1,2], [3,4], ..., [13,14] ];

如果不是,请将其置于此形状。现在:

use constant CHUNKSIZE => 3;

my $stmt = sprintf( 'insert into T (col1, col2) values %s', 
                    join(',', '(?,?)' x CHUNKSIZE) );
# $stmt is now 'insert into T (col1, col2) values (?,?),(?,?),(?,?)'

my $sth = $dbh->prepare($stmt);

while( my @chunk = splice( @{$values}, 0, CHUNKSIZE ) ) {
    # @chunk has 3 elements (rows), or less for the last chunk
    if (scalar @chunk == CHUNKSIZE) {
        $sth->execute( @chunk ); # inserts 3 rows at once
    } else {
        # build and prepare a new statement for the remaining rows.
        # in our sample there is only 1 remaining row.
        $stmt = sprintf( 'insert into T (col1, col2) values %s',
                         join(',', '(?,?)' x scalar @chunk) );
        $sth = $dbh->prepare($stmt);
        $sth->execute( @chunk ); # inserts the last row
    }
}