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存储过程或函数中传入参数与表字段名相同引发的悲剧相关推荐
- 存储过程传入参数与表字段名相同时产生的问题
记得之前写过一篇关于存储过程删除语句的博客,其实就是这个问题,今天又遇到了,问题是我居然搞了好久都没想起来. 下面看代码 BEGIN/* 更新采集任务状态 */DECLARE v_id BIGINT; ...
- WebDay18 MySQL存储过程 存储函数 触发器 事务
MySQL存储过程 存储函数 触发器 事务 一.MySQL存储过程和函数 1.存储过程和函数的概念 2.存储过程和函数的好处 3.存储过程和函数的区别 4.创建存储过程 5.调用存储过程 6.查看存储 ...
- 【MySQL学习】4、MySQL存储过程和函数
文章目录 1.存储过程和函数概念 2.存储过程的使用 (1)创建存储过程 (2)调用存储过程 (3)查看存储过程 (4)删除存储过程 3.存储过程的语法 (1)声明变量 (2)if条件判断 (3)传递 ...
- mysql存储过程与函数、触发器、游标、变量等知识点详解
引言:该文章仅供自己学习整理 mysql执行顺序 语法顺序 写sql的关键字顺序 select [distinct] from join(如left join) on where group by h ...
- [MySQL]存储过程与函数
文章目录 1. 存储过程概述 1.1 含义 1.2 执行过程 1.3 好处 1.4 与视图.函数的对比 1.5 存储过程的分类 2. 创建存储过程 2.1 语法 2.2 设置结束标志 2.3 创建存储 ...
- Mysql学习总结(11)——MySql存储过程与函数
2019独角兽企业重金招聘Python工程师标准>>> 摘要:存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程 ...
- MySql存储过程与函数
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行 ...
- C++函数的传入参数是指针的指针(**)的详解
要修改变量的值,需要使用变量类型的指针作为参数或者变量的引用.如果变量是一般类型的变量,例如int,则需要使用int 类型的指针类型int *作为参数或者int的引用类型int&.但是如果变量 ...
- C语言中关于向函数中传入结构指针的易错点及解决方案
前言(Introduction): 最近在学习链表的过程中,我写了这样一段函数: Recently in the process of learning the linked-list, I wrot ...
最新文章
- 使用GDAL创建Erdas格式的金字塔
- Alamofire源码解读系列(五)之结果封装(Result)
- 鸿蒙系统会支持youtube吗,华为鸿蒙系统,会受到人们的欢迎吗?
- 小白路程之----初学React语法栈之redux与react-redux
- 好程序员Web前端教程分享JavaScript开发技巧
- 单片机c语言随机数,单片机C语言如何产生随机数
- 【Tensorflow-Error】CUDA_ERROR_OUT_OF_MEMORY: out of memory
- 使用文件监控对象FileSystemWatcher实现数据同步
- android.support.v7.app.AlertDialog.Builder使用说明
- knn约会_出色的在线约会预订系统应具备的5个功能
- asp.net获取ip地址的方法
- L2TP-***通用原理取证及在华为防火墙上的实施
- 【项目篇- 项目团队部分怎么写、如何作图?(两千字图文总结建议)】创新创业竞赛项目计划书、新苗国创(大创)申报书、挑战杯创业计划竞赛
- 基于html的旅游网站-北京
- Kubelet cAdvisor 资源监控
- 真好用!一个提供用emai订阅rss的中文网站
- gprs无线模块与服务器连接,GPRS 模块如何通信_GPRS 模块与服务器通信【原理解析】...
- 实战无成本搭建php社工库,简单、高效、几T数据随便查,高效社工库搭建与数据库整理–深夜福利...
- efci 计算机网络,数值型关联规则挖掘在网络入侵检测系统中的应用研究
- java黑马面试_JavaWeb-黑马面面(面试刷题系统)项目实战
热门文章
- LeetCode 91. Decode Ways
- Running Spark on YARN
- Sublime Text 快捷键
- Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TAB
- winform下载网页源码
- Ubuntu下编译Android源代码
- Win7下安装ubuntu (双硬盘用户加强版)
- 强大的SPGridView
- c++在调用类的时候不一定非得实例化对象哦,有时候你不写系统会为你默认生成一个临时实例对象哦~
- Java反射之如何判断类或变量、方法的修饰符(Modifier解析)