我遇到过数据库中表数据没了的情况。
一开始还以为是遇见了bug。 其实是我自己的锅,忘记commit了。

我们来看一下案发现场。

DELIMITER $$
CREATE PROCEDURE insert_dept(IN START INT(10),IN max_num INT(10))  
BEGIN  
 SET autocommit = 0;    
# xxxxxxxxxxxxxxxxx插入数据
 COMMIT;  
 END $$ 
 
# DELIMITER ;

这是我的一个存储过程,我下午插入了200W数据,用这个存储过程。
但是可以发现我set autocommit=0之后没有set autocommit=1.
然后我后面创建了个别的表,添加数据。但是没有commit。正好这时我出去了一下,回来发现与数据库连接中断了。然后晚上我说再看看我新建的那个表,发现数据空了。。。然后我用show table status发现有记录呀。有图有真相!

明明显示我class中有Rows=4,stu中Rows=9.但是我下面的select语句查出来都是空,这让我很郁闷。。。。

中间我感觉是不是因为没有commit,我就又commit了一次,查看是否是autocommit,结果autocommit=ON,我的大脑已经忘记中间断开过一次连接。(重新连接后autocommit会还原设置。。。)。
经过了一晚上的思考,想想自己下午到底干了什么。第二天早晨终于还原了案发现场,破案了。

具体原因如下

因为MySQL中InnoDB是事务型的存储引擎,设置autocommit=0,使用insert语句在没有commit的时候也会导致show table status中Rows数量上升。InnoDB中Rows是不准确的。

还有就是DDL语句(创建修改表结构的语句),会自动commit,设置autocommit=0也会自动提交。所以会出现我那种跟表数据清空的情况。。。

牢记:show table status中Rows显示的行数是不准确的对于事务型的存储引擎。

更多推荐

MySQL 数据库中表数据莫名其妙没了的情况