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

Jim*_*Jim 12 mysql perl insert dbi

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

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

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

TIA

小智 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.

  • 这就是DBI中的execute_array.同样在这里使用prepare_cached没有任何区别,因为你只准备了一次,所以这个例子也可能是一个简单的准备. (2认同)

boh*_*ica 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一次实现一行.