mysql - 当更新记录时,如何防止 MySQL 存储过程中的变量值发生变化?

标签 mysql database stored-procedures

我一定是忽略了一些简单的事情。我在 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 变量中。

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

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

最佳答案

这非常令人惊讶,我同意。我不确定如何解释它,但为了它的值(value),试试这个:

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();

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

关于mysql - 当更新记录时,如何防止 MySQL 存储过程中的变量值发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/278633/

相关文章:

mysql 唯一索引与复合索引

php - 每时每刻更新数据

php - 如何使用 date_add 将年、月、日、小时、分钟、秒添加到 mysql 日期?

sql-server - 将数据类型 numeric 转换为 int 时出错

asp.net - 如何通过 FORM 从 ASP.Net MVC 堆栈调用存储过程并在 json 中返回它们?

javascript - 在 getDay 方法之后更改文本

java - 无法使用java在mysql中保存波斯字符(utf-8)

php - 从唯一键插入外键时出现奇怪的错误

mysql - 即使执行存储过程 'operand should contain one column' 后也会出现无法理解的错误

sql-server - "[RODBC] ERROR: Could not SQLExecDirect"因为在过程中插入语句