我正在使用带有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的原始值,因为我已经到处搜索并尝试了各种解决方案。
答案 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'
};