Как я могу получить последнюю строку, которую я вставил с помощью DBI?

Как получить последнюю вставленную строку с помощью DBI (DBD::mysql)?

Пример кода:

my $sth = $dbh->prepare('INSERT INTO a ( x, y, z ) VALUES ( ?, ?, ? )');
$sth->execute( $x, $y, $z );

Как я могу получить доступ к данным, которые были вставлены вышеуказанным оператором prepare? Мне нужно получить значение основного идентификатора (AUTOINCREMENT).

ОБНОВЛЕНИЕ:

Из документации DBD::mysql:

Альтернативный способ доступа к этому атрибуту — через $dbh->{'mysql_insertid'}.

Спасибо Манни и n0rd за ваши ответы. :-)


person Alan Haggai Alavi    schedule 15.12.2009    source источник


Ответы (3)


Это свойство дескриптора оператора. Вы должны иметь доступ к идентификатору следующим образом:

$sth->{mysql_insertid}
person innaM    schedule 15.12.2009
comment
$dbh->{mysql_insertid} возвращает то же самое. - person Eugene Yarmash; 29.03.2013
comment
Не могли бы вы получить другой ответ, если бы между вашей вставкой и этим звонком была вставка? - person Sam Selikoff; 09.09.2013
comment
Конечно. Вы должны запросить $sth->{ mysql_insertid } сразу после интересующей вас инструкции INSERT. - person innaM; 10.09.2013
comment
Перефразируя то, что было сказано ниже. . . Я полагаю, что Сэм спрашивает, может ли окно между вставкой и извлечением иметь промежуточную вставку из внешнего процесса. Да, это возможно, но mysql_insertid (и не пытайтесь использовать его в оракуле) — это последняя вставка, выполненная вашей сессией, так что не беспокойтесь. - person Vic K; 20.11.2019

Независимый от базы данных подход заключается в использовании DBI в last_insert_id. Такой подход помогает уменьшить зависимость от конкретной базы данных:

$dbh->last_insert_id

$rv = $dbh->last_insert_id($catalog, $schema, $table, $field);

Возвращает значение, «идентифицирующее» только что вставленную строку, если это возможно. Обычно это значение, присвоенное сервером базы данных столбцу с типом auto_increment или serial. Возвращает undef, если драйвер не поддерживает метод или не может определить значение.

person Graham Miln    schedule 23.09.2014

SELECT LAST_INSERT_ID() запрос также вернуть то, что вы хотите.

person n0rd    schedule 15.12.2009
comment
@ Энтони, это неправильно. LAST_INSERT_ID() имеет отношение только к вашему текущему соединению mysql и не зависит от того, что кто-либо еще делает на вашем сервере. - person thelogix; 25.09.2015
comment
Базовый драйвер DBI, возможно, не mysql - person Eugen Konkov; 11.08.2016