我在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的数据。我做错了什么。
答案 0 :(得分:6)
我猜你对关系数据库不太熟悉。你做的是:
@a
@a
a
值;这意味着:
@a
b
和c
为NULL
。 现在,您同样为@b
和@c
执行此操作。这不是很有效。
DBI旨在帮助您。您应该考虑以下规则(指南):
quote
方法或更好placeholders。这样可以省去addind引用的麻烦。INSERT
或UPDATE
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;
}