【问题标题】:How do I keep the variable value in a MySQL stored procedure from changing when records are updated?如何在更新记录时保持 MySQL 存储过程中的变量值不发生变化?
【发布时间】:2008-11-10 17:50:29
【问题描述】:

我一定忽略了一些简单的事情。我在 MySQL 存储过程中从查询结果中设置一个变量,如下所示:

SELECT @myName := username FROM User WHERE ID=1;

所以,@myName 存储的是用户 ID 1 的用户名,即“Paul”。太好了。

但稍后在存储过程中我对此记录运行更新:

UPDATE User SET username = 'Fred' WHERE ID=1;

现在,由于某种原因,@myName = 'Fred' 仍然应该等于 'Paul',对吧?看起来 MySQL 只是在创建一个指向记录的指针,而不是在 @myName 变量中存储一个静态值。

简而言之,我希望能够将查询结果中的值存储在变量中,并确保我的变量的值不会改变,即使它设置的表中的数据发生了变化。

我错过了什么?提前致谢!

【问题讨论】:

  • 我遇到了同样的错误。有解决办法吗?

标签: mysql database stored-procedures


【解决方案1】:

这很令人惊讶,我同意。我不知道如何解释它,但为了它的价值,试试这个:

SELECT username INTO myName FROM User WHERE ID=1;

http://dev.mysql.com/doc/refman/5.0/en/select-into-statement.html

更新:我正在尝试重现此问题,但我不能。我在 Mac OS X 上使用 MySQL 5.0.51。

drop table if exists user;
create table user (
  id serial primary key,
  username varchar(10)
);
insert into user (username) values ('Paul');

drop procedure if exists doit;
delimiter !!
create procedure doit()
begin
  declare name varchar(10);
  select @name:=username from user where id=1;
  select @name; -- shows 'Paul' as expected
  update user set username = 'Fred' where id=1;
  select @name; -- still shows 'Paul'
end!!
delimiter ;

call doit();

您能否在您的测试数据库中尝试上面的代码,如果它出现您描述的问题,请告诉我们?

【讨论】:

    【解决方案2】:

    变量@name 仍然具有值Paul。 如果你想更新你的变量,你应该分配新值:

    drop procedure if exists doit;
    delimiter !!
    create procedure doit()
    begin
      declare name varchar(10);
      select @name:=username from user where id=1;
      select @name; -- shows 'Paul' as expected
      update user set username = 'Fred' where id=1;
      select @name:=username from user where id=1; -- this will update the @name value
      select @name; -- shows 'Fred'
    end!!
    delimiter ;
    
    call doit();
    

    【讨论】:

      【解决方案3】:
      drop table if exists user;
      create table user (
      id serial primary key,
      username varchar(10)
      );
      insert into user (username) values ('Paul');
      
      drop procedure if exists doit;
      delimiter !!
      create procedure doit()
      begin
      declare name varchar(10);
      select @name:=username from user where id=1;
      select @name; -- shows 'Paul' as expected
      
      set  @name = '' /*Initialize @name with '' and then get the result as you expected*/
      
      update user set username = 'Fred' where id=1;
      select @name; -- now you will get exepected results
      end!!
      delimiter ;
      
      call doit();
      

      问候, Jitendra Pasi.(乌加姆)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-09
        • 1970-01-01
        相关资源
        最近更新 更多