如何将三个Perl数组中的数据插入到单个MySQL表中?

Dee*_*pak 2 mysql arrays perl insert

我在Perl中有3个不同的数组(即A,B和C).现在,我在mysql中有一个表,它还有3个字段.

我要做的是在mysql表的第一个字段中获取数组A的所有内容,在第二个字段中获取数组B的内容,依此类推.我尝试使用foreach循环执行此操作,但它适用于第一个数组,但不会为第二个和第三个数组插入任何内容.

代码使用如下:

foreach my $a (@a) {

    my $sql = "insert into es(a) VALUES(\"$a\")";
    my $sth = $dbh->prepare($sql);
    $sth->execute or die "SQL Error: $DBI::errstr\n";
}


foreach my $b (@b) {

    my $sql = "insert into es(b) VALUES(\"$b\")";
    my $sth = $dbh->prepare($sql);
    $sth->execute or die "SQL Error: $DBI::errstr\n";

}
Run Code Online (Sandbox Code Playgroud)

并且类似地为第三.表的列a正确填充,但表中没有列b和c的数据.我究竟做错了什么.

sim*_*que 6

我猜你对关系数据库不太熟悉.你做的是:

  1. 迭代 @a
  2. 为每个项目准备一份新的声明 @a
  3. 每个插入添加一行,只包含其中的a值; 这意味着:
    • 您为每个项目创建一个数据集 @a
    • bcNULL.

现在你做的@b@c同样.这不是很有效.

DBI旨在帮助您.您应该考虑以下规则(指南):

  • 始终使用DBI的quote方法或更好的占位符.这样可以省去addind引用的麻烦.
  • 如果有一个循环和几个INSERTs或UPDATEs,那么总是prepare在循环之外进行查询而只是execute循环中的查询.

我们来看看你的问题吧.我假设@a,@b并且@c所有项目的数量都相同,并且您希望每个索引有一行@a,@b@c.所以如果你有这些数据:

my @a = (1, 2, 3);
my @b = qw(foo bar baz)
my @c = (999, 998, 997);
Run Code Online (Sandbox Code Playgroud)

我敢打赌,你希望它在db中看起来像这样:

a b   c
1 foo 999
2 bar 998
3 baz 997
Run Code Online (Sandbox Code Playgroud)

因此,我们需要将您的三个结合INSERT成一个陈述.这可以通过一次迭代所有这些来完成.我们可以使用List :: MoreUtils中each_array函数来处理迭代.我们还将上面的指南添加到代码中.

use List::MoreUtils qw(each_array);
my $dbh = DBI->connect(); # connect to db here

# prepare the INSERT statement once
my $sth_insert = $dbh->prepare('INSERT INTO es SET a=?, b=?, c=?')
  or die $dbh->errstr;

# create the array iterator
my $ea = each_array(@a, @b, @c);
# iterate over all three arrays step by step
while ( my ($val_a, $val_b, $val_c) = $ea->() ) {
  $sth_insert->execute($val_a, $val_b, $val_c) or die $dbh->errstr;
}
Run Code Online (Sandbox Code Playgroud)