【问题标题】:Perl DBI MySQL Insert with both placeholders and foreign key带有占位符和外键的 Perl DBI MySQL 插入
【发布时间】:2015-06-22 15:00:53
【问题描述】:

我对 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 记录在子表中时,我只是找不到如何做。感谢您的帮助! :)

【问题讨论】:

    标签: mysql perl dbi


    【解决方案1】:

    您可以从插入列表中省略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);
    }
    

    【讨论】:

    • 谢谢你,鲍罗丁。我开始尝试各种随机嵌套语句,并想出了一些非常相似的东西。
    • 我刚刚意识到我的工作还不太正常,我的 $sql = 'INSERT INTO mhqc (fieldnum, result, File_Id) 值 (?, ?, (SELECT records.File_ID FROM records WHERE fname= ?))';事实上,我已经编辑了声明以匹配你的,我也有同样的问题。
    • @emmalg:那么records 中没有与您的文件名匹配的项目。你可以运行它来检查print 'File_Id = ', $dbh-&gt;selectrow_array('SELECT File_Id FROM records WHERE fname = ?', undef, $in_file), "\n";
    • 这两种说法似乎都有效且有效。 NULL File_Id 是因为我需要从 $in_file 变量中删除文件扩展名 - 哎呀 - 我认为需要我的午餐!非常感谢,您的回答确实对我有所帮助,因为我没有使用 $in_file 的占位符开始。
    猜你喜欢
    • 2012-12-22
    • 2015-08-07
    • 2012-09-25
    • 1970-01-01
    • 2020-11-19
    • 2012-09-07
    • 2010-12-24
    • 1970-01-01
    • 2017-05-20
    相关资源
    最近更新 更多