在我的代碼中,我使用database->last_insert_id(undef,undef,undef,"id");
來獲取自動增量主鍵。這工作99.99%的時間。但偶爾會返回0值。 在這種情況下,使用與INSERT語句的值類似的WHERE子句運行select將顯示insert成功。指示last_insert_id方法未能獲得正確的數據。Perl5 DBI Mysql:獲取last_insert_id的可靠方法
這是一個已知的問題已知的修復?或者我應該跟蹤每次調用last_insert_id檢查,看看它是否爲零,如果是的話,選擇語句檢索正確的ID值?
我的MySQL版本是 的MySQL版本14.14 DISTRIB 19年5月7日,對於Linux下(x86_64)
EDIT1:添加實際的失敗代碼。
use Dancer2::Plugin::Database;
<Rest of the code to create the insert parameter>
eval{
database->quick_insert("build",$job);
$job->{idbuild}=database->last_insert_id(undef,undef,undef,"idbuild");
if ($job->{idbuild}==0){
my $build=database->quick_select("build",$job);
$job->{idbuild}=$build->{idbuild};
}
};
debug ("=================Scheduler build Insert=======================*** ERROR :Got Error",[email protected]) if [email protected];
注意:我使用的是Dancer的數據庫插件。誰介紹說,
提供一種簡單的方式,通過 獲得連接DBI數據庫句柄簡單地調用您的應用程序Dancer2
返回一個舞者::插件::數據庫::核心內的數據庫關鍵字:處理對象,這是DBI的DBI :: db連接句柄對象的一個子類,因此它確實可以用DBI做的所有事情,但也增加了幾個 便利方法。有關這些的完整詳細信息,請參閱 Dancer :: Plugin :: Database :: Core :: Handle的文檔。
你知道那個返回數據庫句柄的最後一個插入,對吧?插入後立即執行,還是先做其他事情?連接是否會超時(或死亡),您的客戶正在獲取新的句柄?我很確定last_insert_id沒有一些普遍存在的問題,所以你的代碼可能會有些怪異。展示下。 – ysth
我已更新我的原始問題以添加失敗的代碼片段。 我在插入後立即調用last_insert_id。 我已經將'RaiseError'和'PrintError'選項傳遞給了我的連接,但是我沒有看到此故障的任何錯誤消息。 – vijayvithal