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

时间:2012-09-21 10:37:20

标签: 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";

}

和第三类似。 表的列a正确填充,但表中没有列b和c的数据。我做错了什么。

1 个答案:

答案 0 :(得分:6)

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

  1. 遍历@a
  2. @a
  3. 中的每个项目准备一份新语句
  4. 每个插入添加一行,其中只有a值;这意味着:
    • @a
    • 的每个项目创建数据集
    • bcNULL
  5. 现在,您同样为@b@c执行此操作。这不是很有效。

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

    • 始终使用DBI的quote方法或更好placeholders。这样可以省去addind引用的麻烦。
    • 如果有一个循环以及多个INSERTUPDATE s,则始终prepare您的查询不在循环中,而只是循环中的execute

    让我们来看看你的问题。我认为@a@b@c都具有相同数量的项目,并且您希望每个@a@b的索引一行@c 即可。所以,如果您有这些数据:

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

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

    a b   c
    1 foo 999
    2 bar 998
    3 baz 997
    

    因此,我们需要将您的三个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;
    }