zoukankan      html  css  js  c++  java
  • mysql 删除语句

    DELETE FROM `db`.`TABLE` WHERE `A`='a' AND `B`='b';

    这是一个简单的删除语句,单独执行这个语句不会报错,但是将这个语句放到存储过程中运行,执行也不会报错,但是有可能会删掉其他的数据

    CREATE DEFINER=`usr`@`localhost` PROCEDURE `clear`(IN `a` VARCHAR(50), IN `b` VARCHAR(20))
    BEGIN
    DECLARE flag TINYINT DEFAULT '1'; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN SELECT 0 INTO flag; END; START TRANSACTION; DELETE FROM `db`.`TABLE` WHERE `A`=a AND `B`=b; IF flag=0 THEN ROLLBACK; ELSE COMMIT; END IF; SELECT flag; END

    这个存储过程在执行的时候有可能会将满足`A`=a 或 `B`=b其中一个条件的数据全部删除,而不是删除同时满足两个条件的数据,具体为什么会出现这种问题我不清楚。

    经过各种分析和尝试,发现如果在字段名前面带上表名就可以准确的删除想要删除的数据

     DELETE FROM `db`.`TABLE` WHERE `TABLE`.`A`='a' AND `TABLE`.`B`='b';

    将删除语句改成这样就不会出错。

    虽然字段名前面不带表名不一定会出错,但是带表名是肯定不会出错的,而且这样写是个好习惯

    补充:找到原因了,存储过程传入参数如果与表字段名相同就可能出现上述错误,修改存储过程参数名或者字段名前面带上表名就不会出错了

  • 相关阅读:
    木棍加工 [搜索]
    (转)CSP前必须记住的30句话
    [NOI2015] 程序自动分析
    JOI 2019 Final 硬币收藏
    可达性统计
    CSP-S初赛考纲内容大全
    AT2021 キャンディーとN人の子供 / Children and Candies
    AT2067 たくさんの数式 / Many Formulas
    NOIP2018提高组初赛某题
    String转Map集合
  • 原文地址:https://www.cnblogs.com/quyixuanblog/p/5464715.html
Copyright © 2011-2022 走看看