我在使用MySQL Perl DBI时遇到了一些麻烦。我搜索过,一次只能找到答案的一半,我不知道如何结合我所知道的答案得到正确答案。
我有几个数据库,一个是父数据库:
mysql> desc records;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| File_Id | int(11) | NO | PRI | NULL | auto_increment |
| fname | varchar(59) | YES | | NULL | |
| type | varchar(3) | YES | | NULL | |
| n1size | int(11) | YES | | NULL | |
| downdate | date | YES | | NULL |
mysql> desc mhqc;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| MQ_Id | int(11) | NO | PRI | NULL | auto_increment |
| fieldnum | tinyint(4) | YES | | NULL | |
| result | varchar(10) | YES | | NULL | |
| File_Id | int(11) | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+----------------+
已填写记录,我想将记录添加到mhqc中。我正在弄乱我的SQL语句!
我需要插入的变量(为简单起见而定义)是:
my @fields = (1..41); # this is for the fieldname column
my @results # 41 elements, contains results of checks performed on the fields 1-41
所以,我想循环结果/字段的数量:
INSERT INTO mphqc (MQ_Id, fieldname, result, File_Id) values (NULL, ?, ? ...
......在这里我被困住了。我显然需要包含某种选择语句,如下所示,将所有内容组合在一起
SELECT File_Id from records where fname = \'$in_file';
当File_Id需要记录在子表中时,我无法找到如何做到这两点。非常感谢您的帮助! :)
答案 0 :(得分:2)
您可以从插入列表中省略MQ_Id
并将其设为默认值。需要使用SELECT语句提供其他值,并且需要占位符以便在调用execute
时传递参数。
像这样(未经测试)
my $insert = $dbh->prepare(<<__END_SQL__);
INSERT INTO mhqc (fieldnum, result, File_Id)
SELECT ?, ?, File_Id FROM records WHERE fname = ?
__END_SQL__
for my $i ( 0 .. $#fields ) {
my $fieldnum = $fields[$i];
my $result = $results[$i];
$insert->execute($fieldnum, $result, $in_file);
}