我遇到过数据库中表数据没了的情况。
一开始还以为是遇见了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显示的行数是不准确的对于事务型的存储引擎。