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

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存储过程或函数中传入参数与表字段名相同引发的悲剧相关推荐

  1. 存储过程传入参数与表字段名相同时产生的问题

    记得之前写过一篇关于存储过程删除语句的博客,其实就是这个问题,今天又遇到了,问题是我居然搞了好久都没想起来. 下面看代码 BEGIN/* 更新采集任务状态 */DECLARE v_id BIGINT; ...

  2. WebDay18 MySQL存储过程 存储函数 触发器 事务

    MySQL存储过程 存储函数 触发器 事务 一.MySQL存储过程和函数 1.存储过程和函数的概念 2.存储过程和函数的好处 3.存储过程和函数的区别 4.创建存储过程 5.调用存储过程 6.查看存储 ...

  3. 【MySQL学习】4、MySQL存储过程和函数

    文章目录 1.存储过程和函数概念 2.存储过程的使用 (1)创建存储过程 (2)调用存储过程 (3)查看存储过程 (4)删除存储过程 3.存储过程的语法 (1)声明变量 (2)if条件判断 (3)传递 ...

  4. mysql存储过程与函数、触发器、游标、变量等知识点详解

    引言:该文章仅供自己学习整理 mysql执行顺序 语法顺序 写sql的关键字顺序 select [distinct] from join(如left join) on where group by h ...

  5. [MySQL]存储过程与函数

    文章目录 1. 存储过程概述 1.1 含义 1.2 执行过程 1.3 好处 1.4 与视图.函数的对比 1.5 存储过程的分类 2. 创建存储过程 2.1 语法 2.2 设置结束标志 2.3 创建存储 ...

  6. Mysql学习总结(11)——MySql存储过程与函数

    2019独角兽企业重金招聘Python工程师标准>>> 摘要:存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程 ...

  7. MySql存储过程与函数

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行 ...

  8. C++函数的传入参数是指针的指针(**)的详解

    要修改变量的值,需要使用变量类型的指针作为参数或者变量的引用.如果变量是一般类型的变量,例如int,则需要使用int 类型的指针类型int *作为参数或者int的引用类型int&.但是如果变量 ...

  9. C语言中关于向函数中传入结构指针的易错点及解决方案

    前言(Introduction): 最近在学习链表的过程中,我写了这样一段函数: Recently in the process of learning the linked-list, I wrot ...

最新文章

  1. 使用GDAL创建Erdas格式的金字塔
  2. Alamofire源码解读系列(五)之结果封装(Result)
  3. 鸿蒙系统会支持youtube吗,华为鸿蒙系统,会受到人们的欢迎吗?
  4. 小白路程之----初学React语法栈之redux与react-redux
  5. 好程序员Web前端教程分享JavaScript开发技巧
  6. 单片机c语言随机数,单片机C语言如何产生随机数
  7. 【Tensorflow-Error】CUDA_ERROR_OUT_OF_MEMORY: out of memory
  8. 使用文件监控对象FileSystemWatcher实现数据同步
  9. android.support.v7.app.AlertDialog.Builder使用说明
  10. knn约会_出色的在线约会预订系统应具备的5个功能
  11. asp.net获取ip地址的方法
  12. L2TP-***通用原理取证及在华为防火墙上的实施
  13. 【项目篇- 项目团队部分怎么写、如何作图?(两千字图文总结建议)】创新创业竞赛项目计划书、新苗国创(大创)申报书、挑战杯创业计划竞赛
  14. 基于html的旅游网站-北京
  15. Kubelet cAdvisor 资源监控
  16. 真好用!一个提供用emai订阅rss的中文网站
  17. gprs无线模块与服务器连接,GPRS 模块如何通信_GPRS 模块与服务器通信【原理解析】...
  18. 实战无成本搭建php社工库,简单、高效、几T数据随便查,高效社工库搭建与数据库整理–深夜福利...
  19. efci 计算机网络,数值型关联规则挖掘在网络入侵检测系统中的应用研究
  20. java黑马面试_JavaWeb-黑马面面(面试刷题系统)项目实战

热门文章

  1. LeetCode 91. Decode Ways
  2. Running Spark on YARN
  3. Sublime Text 快捷键
  4. Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TAB
  5. winform下载网页源码
  6. Ubuntu下编译Android源代码
  7. Win7下安装ubuntu (双硬盘用户加强版)
  8. 强大的SPGridView
  9. c++在调用类的时候不一定非得实例化对象哦,有时候你不写系统会为你默认生成一个临时实例对象哦~
  10. Java反射之如何判断类或变量、方法的修饰符(Modifier解析)