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

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;”,编译是通不过的,不信,你试试。

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

  1. SQL查询数据库中所有表、表字段名及数据类型

    select b.name,a.colid,a.name ,())+')' from systypes where a.xusertype=systypes.xusertype ) type from ...

  2. Mysql存储过程和函数

    Mysql存储过程和函数 基本概念: 创建存储过程和函数是指将经常使用的一组SQL语句的组合在一起,并将这些SQL语句当作一个整体存储在MySQL服务器中.例如,银行经常需要计算用户的利息.不同类别的 ...

  3. MariaDB/MySQL存储过程和函数

    本文目录:1.创建存储过程.函数 1.1 存储过程的IN.OUT和INOUT2.修改和删除存储过程.函数3.查看存储过程.函数信息 在MySQL/MariaDB中,存储过程(stored proced ...

  4. mysql 存储过程,函数,触发器

    存储过程和函数 mysql> HELP CREATE PROCEDURE; Name: 'CREATE PROCEDURE' Description: Syntax: CREATE [DEFIN ...

  5. MYSQL存储过程和函数学习笔记

    学至Tarena金牌讲师,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和 ...

  6. MySql存储过程与函数详解

    存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程和函数可以避免开发人员重复的编写相同的SQL语句.而且,存储过程和函数是在MyS ...

  7. 12.Mysql存储过程和函数

    12.存储过程和函数12.1 什么是存储过程和函数存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数简化应用开发人员的工作,减少数据在数据库和应用服务器之间的传输, ...

  8. MySql存储过程、函数

    存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程和函数可以避免开发人员重复的编写相同的SQL语句.而且,存储过程和函数是在MyS ...

  9. MYSQL存储过程,函数,光标

    存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] ro ...

随机推荐

  1. azkaban---visualize crontab--frontail

    azkaban---visualize crontab azkaban--docker-----http://www.jkeabc.com/254015.html azkaban--tips   ht ...

  2. Java 输入/输出——字节流和字符流

    1.流的分类 (1)输入流和输出流(划分输入/输出流时是从程序运行所在内存的角度来考虑的) 输入流:只能从中读取数据,而不能向其写入数据. 输出流:只能向其写入数据,而不能从中读取数据. 输入流主要由 ...

  3. 下载JDK和Jmeter并设置系统环境变量

    一.JDK下载并设置系统环境变量 1.JDK官网下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 点左边的 ...

  4. 如何在安装node\npm\cnpm

    1.安装node.js node.js的官方地址为:https://nodejs.org/en/download/. 根据windows版本后,选择要下载的安装包,下载完毕,按照windows一般应用 ...

  5. JLRoutes使用

    JLRoutes 地址:https://github.com/joeldev/JLRoutes JLRoutes原理: 它是通过url scheme来实现app内部,web到app,app与app之间 ...

  6. IGMP协议

    IGMP报文格式: 4bit的IGMP版本(1)+4bit的IGMP类型(1-2)+8bit未用+16bit检验和(同ICMP)+32bit组地址(D类IP地址) 类型为1说明是由多播路由器发出的查询 ...

  7. gitlab数据库

    event表中action对应操作: 1 - 新建项目 5 - push 8 - 在某项目中赋予某人权限 9 - 在某项目中取消某人权限

  8. Too many connections解决方法

    在工作中,大家或许常常遇到Too many connections这个错误,这时作为DBA想进数据库管理都进不去,是非常尴尬的一件事情.当然有同学说可以修改配置文件,但是修改配置文件是需要重启mysq ...

  9. OpenWrt 路由系统上抓包

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/qianguozheng/article/details/32108093 前言: 做路由器开发,难免 ...

  10. linux配置基本业务

    1.安装一些必备软件 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel ...