Perl DBI MySQL Insert同时包含占位符和外键

时间:2015-04-16 09:35:13

标签: mysql perl dbi

我在使用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需要记录在子表中时,我无法找到如何做到这两点。非常感谢您的帮助! :)

1 个答案:

答案 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);
}