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;