首页 > 技术文章 > mysql 删除语句

quyixuanblog 2016-05-06 10:37 原文

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';

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

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

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

推荐阅读