我必须忽略一些简单的事情。我正在MySQL存储过程中的查询结果中设置一个变量,如下所示:
SELECT @myName := username FROM User WHERE ID=1;
因此,@ myName存储用户标识1的用户名,即“保罗”。大。
但是后来在存储过程中我对此记录运行了更新:
UPDATE User SET username = 'Fred' WHERE ID=1;
现在,出于某种原因,@ myName ='Fred',它应该仍然等于'Paul',对吧?似乎MySQL只是创建一个指向记录的指针,而不是在@myName变量中存储静态值。
因此,简而言之,我希望能够在查询结果的变量中存储一个值,并确保我的变量的值不会改变,即使表中的数据是根据更改设置的。
我错过了什么?提前谢谢!
答案 0 :(得分:2)
这是非常令人惊讶的,我同意。我不确定如何解释它,但是为了它的价值,试试这个:
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.5。
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();
您可以在测试数据库中尝试上面的代码,并告诉我们它是否表现出您描述的问题吗?
答案 1 :(得分:0)
变量@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();
答案 2 :(得分:0)
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。(Ugam)