zoukankan      html  css  js  c++  java
  • 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;”,编译是通不过的,不信,你试试。

    igoodful@qq.com
  • 相关阅读:
    设计模式-抽象工厂模式
    设计模式-工厂方法模式
    设计模式-简单工厂模式
    设计模式-代理模式
    Retrofit原理学习
    Google Flutter的学习与使用
    Robolectric结合Android Studio的使用
    Android中app的启动步骤
    汽车系统实现--增加数据和删除数据
    vue--实现跑马灯效果
  • 原文地址:https://www.cnblogs.com/igoodful/p/8722599.html
Copyright © 2011-2022 走看看