欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > 数据库 >内容正文

数据库

mysql存储过程或函数中传入参数与表字段名相同引发的悲剧

发布时间:2025/7/25 数据库 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 mysql存储过程或函数中传入参数与表字段名相同引发的悲剧 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

真实案例。如下的一个存储过程:

create procedure Apple(in user_id int)

begin

delete from users where user_id = user_id;

end

    这个存储过程中的users表的主键名就是user_id ,而该存储过程的传入参数也是user_id ,那么该delete语句中的两个user_id 到底都代表哪一个呢?,mysql的处理是将“where user_id = user_id”中的两个user_id都当成了users表中的字段来处理,那么该语句就等价于where 1=1,即该语句表达的是删除users表中的所有数据!!!而这样写这个存储过程的人肯定是是想用传入的参数user_id来匹配字段中的user_id,所以是在一个语句中最好不要出现表的字段名与传入参数同名。(上面仅仅是存储过程的一部分,删去了其他部分,显然这是一个事务,肯定得有事务处理,但是此处略了)。

解决办法有:

(1)杜绝存储过程或函数的传入参数同名。比如将上面的传入参数名称改为p_user_id就可以了,即delete from users where user_id = p_user_id;

(2)利用表的别名。比如上面的例子可以改为:delete t from users t where t.user_id = user_id;不过,这里需要注意,在mysql中的delete语句中使用表的别名有些特殊,需要在delete后面加上表的别名。如果像这样“delete from users t where t.user_id = user_id;”,编译是通不过的,不信,你试试。

 

转载于:https://www.cnblogs.com/igoodful/p/8722599.html

总结

以上是生活随笔为你收集整理的mysql存储过程或函数中传入参数与表字段名相同引发的悲剧的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。