Perl DBI вставляет несколько строк, используя встроенную возможность множественной вставки mysql - PullRequest
12 голосов
/ 07 декабря 2011

Кто-нибудь видел модуль DBI-типа для Perl, который легко использует многослойный синтаксис MySQL

insert into TBL (col1, col2, col3) values (1,2,3),(4,5,6),...?

Я еще не нашел интерфейс, который позволяет мне это делать. Единственное, что я нашел, это циклически проходить через мой массив. Этот метод кажется гораздо менее оптимальным, чем бросать все в одну строку и позволить MySQL справиться с этим. Я не нашел какой-либо документации там IE IE, которая проливает свет на этот недостаток катания моего собственного кода, чтобы сделать это.

1010 * ТИА *

Ответы [ 3 ]

12 голосов
/ 08 декабря 2011

Есть два подхода. Вы можете вставить (?, ?, ?) несколько раз в зависимости от размера массива. Работа с текстом будет выглядеть примерно так:

my $sql_values = join( ' ', ('(?, ?, ?)') x scalar(@array) );

Затем сгладьте массив для вызова execute(). Я бы избежал этого из-за сложной обработки строк и массивов.

Другой способ - начать транзакцию, а затем выполнить один оператор вставки несколько раз.

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;

Это немного медленнее, чем в первом методе, но все же избегает повторного анализа оператора. Он также позволяет избежать тонких манипуляций с первым решением, но при этом остается атомарным и позволяет оптимизировать дисковый ввод-вывод.

9 голосов
/ 08 декабря 2011

Если DBD :: mysql поддерживает DBI execute_for_fetch (см. DBI execute_array и execute_for_fetch), это типичный сценарий использования, т. Е. Сейчас у вас есть несколько доступных для вставки / обновлений / удалений строк и вы хотите отправить их за один раз (или в пакетном режиме).Я понятия не имею, поддерживают ли клиентские библиотеки mysql отправку нескольких строк связанных параметров за один раз, но большинство других клиентских библиотек баз данных делают это и могут использовать преимущества execute_array / execute_for_fetch DBI.К сожалению, немногие DBD фактически реализуют execute_array / execute_for_fetch и полагаются на DBI, реализуя его по одной строке за раз.

1 голос
/ 08 декабря 2011

Джим, У Фрезика это есть. Это, наверное, самый оптимальный вариант:

my $sth = $dbh->prepare( 'INSERT INTO tbl (?, ?, ?)' );
foreach(@array) { $sth->execute( @{$_} ); }
$sth->finish;
...