【问题标题】:Perl MySQL DBI - update and get last valuePerl MySQL DBI - 更新并获取最后一个值
【发布时间】:2015-02-14 01:54:22
【问题描述】:

我在 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 中返回原始值,因为我到处搜索并尝试了各种解决方案。

【问题讨论】:

    标签: mysql perl dbi


    【解决方案1】:

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

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

    数据库:

    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'
            };
    

    【讨论】:

    • 发布代码是没有意义的,因为我没有一个可以工作的例子,并假设我在哪里挣扎的陈述是不言自明的,像你这样的人可能会回来举一个例子什么会起作用。但我可以看到我需要做什么。我很擅长 perl,但这让我很头疼。但感谢您的意见,非常感谢。
    猜你喜欢
    • 2012-09-05
    • 2012-10-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多