当前位置: 首页 > 科技观察

批量删除数据是一个常见的陷阱!!!当批量删除

时间:2023-03-22 13:24:28 科技观察

行数据时,InnoDB如何处理自增ID是一个潜在的陷阱。整个实验步骤如上图所示:第一步:创建表,设置自增列;第二步:指定id=1插入,锚定第一行id为1;第三步:不指定id,依赖自增机制,插入3行;画外音:这时候id应该变成2、3、4了吧?第四步:删除删除所有记录;画外音:这里容易出坑。第五步:指定id=0进行插入;第六步:指定id=1进行插入;第七步:不指定id,依赖自增机制,插入1行;请问,此时表中的三行记录,id分别是多少?它符合您的期望吗?今天花1分钟说说使用truncate和delete批量删除数据的异同点。批量删除数据常用的方法有以下三种:droptable:当不需要表时可以使用该方法。truncatetable:删除所有数据,同时保留表,速度非常快。画外音:可以理解为,droptable,然后createtable。deletefromtable:可以删除所有数据,保留表,但性能较差。也可以用where条件删除部分数据,比较灵活。truncate和delete虽然都可以删除所有数据,保留表,但是它们之间还是有明显区别的。(1)truncate是DDL语句,没有所谓的“事务回滚”;delete是DML语句,执行后可以回滚。(2)truncatetable返回值为0;deletefromtable的返回值是删除的行数。(3)InnoDB支持一表一文件。这时候:truncate会一次性把表干掉,不会激活触发器,很快;deletefromtable会逐行删除并激活触发器,比较慢。画外音:delete数据需要logging,truncatetable不需要logging。(4)当表中有列被其他表用作外键时:truncate会失败;删除会成功。画外音:这类数据删除失败很容易定位问题,因为错误信息简单易懂。(5)当表中有自增列时:truncate会恢复自增列计数;删除所有数据后,自增列计数不会从头开始。画外音:因此,在删除所有数据后,自动增加列数的行为往往不是用户想要的,因此是一个潜在的陷阱。这一分钟有收获吗?请根据您的业务场景选择删除数据的方式。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文