mysql存储过程或函数中传入参数与表字段名相同引发的悲剧
2023-09-27 14:21:16 时间
真实案例。如下的一个存储过程:
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;”,编译是通不过的,不信,你试试。
相关文章
- MariaDB(mysql)+daloRADIUS 导入数据库导入用户的方法
- mysql存储过程详解[转]
- MySQL 视图、触发器、函数、存储过程
- 如何使用MySQL Workbench创建数据库存储过程
- mysql存储过程的优缺点
- MySQL存储过程 事务transaction
- python+ mysql存储二进制流的方式
- Shell 小技巧的问题 mysql -e ,字符串替换telnet命令检测
- 命令行下 mysql 不是内部或外部命令排查方法
- [转] Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置
- ****Linux MySQL命令运用个人总结
- WebSocket 实时更新mysql数据到页面
- 2022-09-30 mysql列存储引擎-去除TempTableForSubquery引发的memcopy的策略
- 2022-09-22 mysql列存储引擎-支持自定义函数-现有代码分析
- 2023-04-17 mysql列存储-聚合处理-第三阶段-概要设计
- 2022-12-30 mysql列存储引擎-对比text和varchar性能
- 2022-12-13 mysql列存储引擎-GroupBy查询出错-记录
- 2022-12-02 mysql列存储引擎-trigger插入数据错误-记录
- MySQL 存储引擎 (二)
- 玩转Mysql系列 - 第17天:存储过程&自定义函数详解
- Python操作MySQL数据库
- 如何启动MySQL服务
- Windows下安装MySQL压缩zip包
- mysql服务器io等待高定位与分析
- mysql中的函数与存储过程
- MySQL:存储引擎
- 【mysql】IP地址使用整数存储到数据库