Perl MySQL DBI - 更新并获取最后一个值

时间:2015-02-13 11:39:45

标签: mysql perl dbi

我正在使用带有MySQL的Perl DBI模块,并在更新行时尝试获取初始值,然后再添加1。

如果当前值为1000,我需要返回值1000,然后将值加1。

我在perl中使用此语句来使用一个事务......

update TABLE_NAME set ID = (\@cur_value := ID) + 1

我知道我可以选择更新作为两个语句或手动锁定表,但事务在我们的平台上发生得太快,以至于可能导致不一致,这是最快的方法。

但是我根本找不到使用此语句在增量之前返回原始值的方法。

它在ASP中工作正常如下:

qry = "update V15_TRACKING set TRACKING_ID = (@cur_value := TRACKING_ID) + 1 where TRACKING_TYPE='ABC'"
Set oRS = oConn.Execute(qry)
qry = "select @cur_value"
if not oRS.EOF then
        while not oRS.EOF
            CurrTrackingID = oRs.Fields("@cur_value")
            oRS.movenext
        wend
    oRS.close
    end if

请有人可以告诉我,我需要做些什么来恢复Perl的原始值,因为我已经到处搜索并尝试了各种解决方案。

1 个答案:

答案 0 :(得分:1)

显示您在perl中实际执行的操作的代码段,您的结果将有助于诊断脚本中发生的情况。

我尝试了这个简单的例子:

数据库:

CREATE DATABASE TEST;

CREATE TABLE foo (
    id  int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    val int(11) NOT NULL
);

INSERT INTO foo (val) VALUES (1);

和Perl

#!/bin/env perl
use strict;
use warnings;

use Data::Dumper;
use DBI;

my $dbh = DBI->connect('DBI:mysql:database=test', 'dbuser', 'dbpass');

my $select = $dbh->prepare('SELECT * FROM foo WHERE id=?');
my $select_old_val = $dbh->prepare('SELECT @old_val');
my $update = $dbh->prepare('UPDATE foo SET val=(@old_val := val) + 1 WHERE id=?');

$update->execute(1);
$select_old_val->execute();
$select->execute(1);

while (my $row = $select_old_val->fetchrow_hashref) {
    print Dumper $row;
}


while (my $row = $select->fetchrow_hashref) {
    print Dumper $row;
}

过了一会儿:

$ perl select_and_update.pl 
$VAR1 = {
          '@old_val' => '10'
        };
$VAR1 = {
          'id' => '1',
          'val' => '11'
        };