2015-04-16 3 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 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

Я только что понял, что моя работа еще не работает, я получаю NULL в столбце File_Id my $ sql = 'INSERT INTO mhqc (fieldnum, result, File_Id) значения (?,?, (SELECT records.File_ID FROM records WHERE fname =?)) '; Фактически я отредактировал заявление в соответствии с вашим, и у меня такая же проблема. – emmalg

+0

@emmalg: Тогда в 'records' нет элемента, соответствующего вашему имени файла. Вы можете запустить это, чтобы проверить 'print 'File_Id =', $ dbh-> selectrow_array ('SELECT File_Id FROM records WHERE fname =?', Undef, $ in_file)," \ n ";' – Borodin