在 MySQL 中,删除似乎正在截断整个表

Posted

技术标签:

【中文标题】在 MySQL 中,删除似乎正在截断整个表【英文标题】:In MySQL, delete seems to be truncating the whole table 【发布时间】:2014-02-07 23:04:28 【问题描述】:

我正在尝试为大学作业制作一个简单的项目。在那,当我试图从 mysql 中的存储过程中删除记录时,该删除语句正在删除所有记录。

代码如下:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE 
           `removebus`(in busnumber int,out message varchar(255))
BEGIN

    delete from fare where busnumber = busnumber;
    delete from bus where busnumber = busnumber;
    set message = 'success';

    else
        set message = 'not found';
    end if;

END

我正在像call removebus(1,@message);一样执行。

当我试图只从命令窗口执行删除语句时,它只删除一条记录,但是当我执行调用语句时,所有记录都从我的表中删除。补充一下,busnumber 是总线表的主键。我无法理解为什么。

【问题讨论】:

我认为缺少代码,您的 IF 语句在哪里?? 【参考方案1】:

嗯,据我所知,busnumber 总是等于 busnumber... 你不妨写“1 = 1”。

更改变量名称 - 这应该适合您。

【讨论】:

【参考方案2】:

你正在跑步

delete from fare where busnumber = busnumber;

因为表 busnumber 中的每一行都等于自己,因此它们都将被删除。

尝试将输入变量更改为不与列名冲突的内容。

【讨论】:

busnumber = busnumber 或 1 = 1。无论哪种方式,它总是正确的。【参考方案3】:

两件事。首先delete 不是truncate table。它可能具有相同的结果,但性能却大不相同。 delete 记录其所有交易; truncate table 没有。

第二,养成使用特殊前缀命名参数参数的习惯,例如:

CREATE DEFINER=`root`@`localhost` PROCEDURE 
           `removebus`(in in_busnumber int, out out_message varchar(255))
. . . 

如果你不养成这个习惯,你很可能会在很长一段时间内继续犯同样的错误(至少,这是我的经验)。

【讨论】:

以上是关于在 MySQL 中,删除似乎正在截断整个表的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 清空表和截断表

在 HSQLDB 中截断模式

phpunit 中的 dbunit 不会截断表

删除表和截断表之间的区别?

SqlAlchemy 用 ORM 截断表

MySQL:如果表存在,截断并插入 ELSE 创建