delete 会不会锁表_truncate 和 delete
思考
在講 truncate 和 delete 的區(qū)別之前,不妨先看看下面的問題,帶著問題邊思考邊往下看
問題:如上圖所示,紅色框(1) 和 紅色框(2) 中 id 分別是多少
delete 簡述
刪除表全部數(shù)據(jù)或者部分數(shù)據(jù),刪除的時候是一行一行刪除的,所以刪除表全部數(shù)據(jù)時速度比較慢
語句后面可以用 where 過濾待刪除的行,比較靈活
語句執(zhí)行之后會返回本次刪除的行數(shù)
truncate 簡述
刪除表全部數(shù)據(jù),相當于先 drop table 然后 create table, 速度快語句后面不能接過濾條件語句執(zhí)行后沒有返回值,或者說返回值沒有具體的含義區(qū)別
雖然 truncate 和 delete 很相似,但它們有以下不同之處
delete 是一行一行的刪除數(shù)據(jù),truncate 是重新創(chuàng)建表,所以truncate 比 delete 速度快,特別是針對大表
其他表有引用本表列的外鍵字時,truncate 會執(zhí)行失敗,delete 可以執(zhí)行
上圖中?tb?表的?idb?列是ta表的ida列的外鍵引用,truncate table ta?執(zhí)行失敗, truncate table ta?能執(zhí)行成功
truncate 是DDL語句,所以不能回滾,delete 是DML語句,可以回滾
truncate 返回值無意義, delete 返回本次刪除的行數(shù)
針對 AUTO_INCREMENT 列,truncate tablename 會把列值重置為起始值,而 delete from tablename 則不會重置(上面的思考題用到了這條知識點)
delete 的優(yōu)化
前面提到使用 delete 清空大表是速度比較慢,為了保證 delete 語句不會占用大量的時間,可以使用?limit row_count?語句來指定單次刪除的最大行數(shù),如果刪除的行數(shù)大于等于單次刪除的最大行數(shù),重復(fù)執(zhí)行 delete 語句直到刪除的行數(shù)小于單次刪除的最大值
答案
有了前面的介紹之后,思考題的答案應(yīng)該很清晰了
因為表?tt?中?id?列是自增的,truncate 清空表數(shù)據(jù)會重置自增列,而 delete則不會,所以思考題中 (1) 處的 id 分別是 3、4, (2) 處的 id 分別是 1,2
具體的輸出如下圖:
總結(jié)
以上是生活随笔為你收集整理的delete 会不会锁表_truncate 和 delete的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: adb 获取当前activity_ADB
- 下一篇: shinelon笔记本进bios设置u盘