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

我遇到过数据库中表数据没了的情况。
一开始还以为是遇见了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发现有记录呀。有图有真相!
图1
明明显示我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显示的行数是不准确的对于事务型的存储引擎。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值