小智 12
有两种方法.您可以(?, ?, ?)根据阵列的大小插入多次.文本操作类似于:
my $sql_values = join( ' ', ('(?, ?, ?)') x scalar(@array) );
Run Code Online (Sandbox Code Playgroud)
然后压平阵列进行调用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;
Run Code Online (Sandbox Code Playgroud)
这比第一种方法慢一点,但它仍然避免了重新解析语句.它还避免了对第一个解决方案的微妙操作,同时仍然是原子的,并允许优化磁盘I/O.
如果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一次实现一行.
| 归档时间: |
|
| 查看次数: |
8835 次 |
| 最近记录: |