Perl DBI使用mysql本机多插入功能插入多行

时间:2011-12-07 19:59:32

标签: mysql perl insert dbi

有没有人见过Perl的DBI类型模块,可以很容易地利用MySQL的多插入语法

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

我还没有找到允许我这样做的界面。我发现的唯一一件事是遍历我的数组。这种方法似乎不太理想,而不是把所有东西都扔到一行并让MySQL处理它。我没有找到IE浏览器中的任何文档,这些文档揭示了我自己编写代码的缺点。

TIA

3 个答案:

答案 0 :(得分:12)

有两种方法。您可以根据数组的大小多次插入(?, ?, ?)。文本操作类似于:

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

然后展平数组以调用execute()。我会避免这种方式,因为需要完成棘手的字符串和数组操作。

另一种方法是开始一个事务,然后多次运行一个insert语句。

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;

这比第一种方法慢一点,但它仍然避免重新解析语句。它还避免了第一个解决方案的微妙操作,同时仍然是原子的,并允许优化磁盘I / O.

答案 1 :(得分:9)

如果DBD :: mysql支持DBI的execute_for_fetch(请参阅DBI的execute_array和execute_for_fetch),这是典型的使用场景,即您现在有多行插入/更新/删除,并希望一次性发送(或批量发送) )。我不知道mysql客户端库是否支持一次发送多行绑定参数,但大多数其他数据库客户端库都可以,并且可以利用DBI的execute_array / execute_for_fetch。不幸的是,很少有DBD实际上实现了execute_array / execute_for_fetch,并依赖于DBI一次实现一行。

答案 2 :(得分:1)

吉姆, Frezik有它。这可能是最优的:

my $sth = $dbh->prepare( 'INSERT INTO tbl (?, ?, ?)' );
foreach(@array) { $sth->execute( @{$_} ); }
$sth->finish;