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