有没有人见过Perl的DBI类型模块,可以很容易地利用MySQL的多插入语法
insert into TBL (col1, col2, col3) values (1,2,3),(4,5,6),...
?
我还没有找到允许我这样做的界面。我发现的唯一一件事是遍历我的数组。这种方法似乎不太理想,而不是把所有东西都扔到一行并让MySQL处理它。我没有找到IE浏览器中的任何文档,这些文档揭示了我自己编写代码的缺点。
TIA
答案 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;