Perl DBI вставляет несколько строк с использованием способности множественной вставки mysql
Кто-нибудь видел модуль DBI-типа для Perl, который легко и просто накладывает на MySQL синтаксис множественной вставки
insert into TBL (col1, col2, col3) values (1,2,3),(4,5,6),...
?
Я еще не нашел интерфейс, который позволяет мне это делать. Единственное, что я нашел, - это цикл через мой массив. Этот метод кажется намного менее оптимальным, чем бросать все в одну строку и позволять MySQL обрабатывать его. Я не нашел никакой документации, там IE google, которая проливает свет на это, не сводя мой собственный код, чтобы сделать это.
ТИА
Ответы
Ответ 1
Существует два подхода. Вы можете вставить (?, ?, ?)
несколько раз в зависимости от размера массива. Текстовое манипулирование будет выглядеть примерно так:
my $sql_values = join( ' ', ('(?, ?, ?)') x scalar(@array) );
Затем сгладьте массив для вызова execute()
. Я бы избегал этого из-за тернистой обработки строк и массивов, которые нужно выполнить.
Другой способ - начать транзакцию, а затем запустить один оператор insert несколько раз.
my $sql = 'INSERT INTO tbl (col1, col2, col3)';
$dbh->{AutoCommit} = 0;
my $sth = $dbh->prepare_cached( $sql );
$sth->execute( @$_ ) for @array;
$sth->finish;
$dbh->{AutoCommit} = 1;
Это немного медленнее, чем первый метод, но он по-прежнему избегает повторного использования инструкции. Он также избегает тонких манипуляций с первым решением, хотя он все еще является атомарным и позволяет оптимизировать дисковый ввод-вывод.
Ответ 2
Если DBD:: mysql поддерживает DBI execute_for_fetch (см. DBI execute_array и execute_for_fetch), это типичный сценарий использования, т.е. теперь у вас есть несколько строк вложений/обновлений/удалений и вы хотите отправить их за один раз (или в партиях). Я не знаю, поддерживает ли клиентские библиотеки mysql несколько строк связанных параметров за один раз, но большинство других клиентских библиотек базы данных делают и могут использовать DBI execute_array/execute_for_fetch. К сожалению, немногие DBD фактически реализуют execute_array/execute_for_fetch и полагаются на DBI, реализуя его по одной строке за раз.
Ответ 3
Джим,
У Фрезика это есть. Вероятно, это наиболее оптимально:
my $sth = $dbh->prepare( 'INSERT INTO tbl (?, ?, ?)' );
foreach(@array) { $sth->execute( @{$_} ); }
$sth->finish;