2015-04-16 41 views
0

我在使用MySQL Perl DBI時遇到了一些問題。我搜查了一次只能找到一半的答案,我不知道如何結合我所知道的才能得到正確的答案。帶有佔位符和外鍵的Perl DBI MySQL插入

我有幾個數據庫,一個是父:

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語句像下面的一個整合實驗

SELECT File_Id from records where fname = \'$in_file'; 

我只是找不到怎麼辦時,雙方的file_id需要被記錄在子表。感謝您的幫助! :)

回答

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); 
} 
+0

謝謝你,鮑羅廷。我開始嘗試各種隨機嵌套語句,並提出了非常相似的東西。 – emmalg

+0

我剛剛意識到我的工作沒有正常工作,我正在File_Id列中獲取NULL my $ sql ='INSERT INTO mhqc(fieldnum,result,File_Id)values(?,?,(SELECT records.File_ID FROM記錄WHERE fname =?))';事實上,我已經編輯了與您的聲明相匹配的聲明,而且我遇到了同樣的問題。 – emmalg

+0

@emmalg:那麼'記錄'中沒有與您的文件名相匹配的項目。你可以運行這個來檢查'print'File_Id =',$ dbh-> selectrow_array('SELECT File_Id FROM records WHERE fname =?',undef,$ in_file),「\ n」;' – Borodin