MySQL Truncate用法詳解
刪除表中的數(shù)據(jù)的方法有delete,truncate, 其中TRUNCATE TABLE用于刪除表中的所有行,而不記錄單個(gè)行刪除操作。TRUNCATE TABLE 與沒有 WHERE 子句的 DELETE 語句類似;但是,TRUNCATE TABLE 速度更快,使用的系統(tǒng)資源和事務(wù)日志資源更少。下面介紹SQL中Truncate的用法
當(dāng)你不再需要該表時(shí), 用 drop;當(dāng)你仍要保留該表,但要?jiǎng)h除所有記錄時(shí), 用 truncate;當(dāng)你要?jiǎng)h除部分記錄時(shí)(always with a WHERE clause), 用 delete.
Truncate是一個(gè)能夠快速清空資料表內(nèi)所有資料的SQL語法。并且能針對(duì)具有自動(dòng)遞增值的字段,做計(jì)數(shù)重置歸零重新計(jì)算的作用。
MySQL Truncate用法
一、Truncate語法
[ { database_name.[ schema_name ]. | schema_name . } ]
table_name
[ ; ]
參數(shù)
database_name
數(shù)據(jù)庫的名稱。
schema_name
表所屬架構(gòu)的名稱。
table_name
要截?cái)嗟谋淼拿Q,或要?jiǎng)h除其全部行的表的名稱。
二、Truncate使用注意事項(xiàng)
1、TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統(tǒng)和事務(wù)日志資源少。
2、DELETE 語句每次刪除一行,并在事務(wù)日志中為所刪除的每行記錄一項(xiàng)。TRUNCATE TABLE 通過釋放存儲(chǔ)表數(shù)據(jù)所用的數(shù)據(jù)頁來刪除數(shù)據(jù),并且只在事務(wù)日志中記錄頁的釋放。
3、TRUNCATE TABLE 刪除表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變。新行標(biāo)識(shí)所用的計(jì)數(shù)值重置為該列的種子。如果想保留標(biāo)識(shí)計(jì)數(shù)值,請(qǐng)改用 DELETE。如果要?jiǎng)h除表定義及其數(shù)據(jù),請(qǐng)使用 DROP TABLE 語句。
4、對(duì)于由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應(yīng)使用不帶 WHERE 子句的 DELETE 語句。由于 TRUNCATE TABLE 不記錄在日志中,所以它不能激活觸發(fā)器。
5、TRUNCATE TABLE 不能用于參與了索引視圖的表。
6、對(duì)用TRUNCATE TABLE刪除數(shù)據(jù)的表上增加數(shù)據(jù)時(shí),要使用UPDATE STATISTICS來維護(hù)索引信息。
7、如果有ROLLBACK語句,DELETE操作將被撤銷,但TRUNCATE不會(huì)撤銷。
三、不能對(duì)以下表使用 TRUNCATE TABLE
1、由 FOREIGN KEY 約束引用的表。(您可以截?cái)嗑哂幸米陨淼耐怄I的表。)
2、參與索引視圖的表。
3、通過使用事務(wù)復(fù)制或合并復(fù)制發(fā)布的表。
4、對(duì)于具有以上一個(gè)或多個(gè)特征的表,請(qǐng)使用 DELETE 語句。
5、TRUNCATE TABLE 不能激活觸發(fā)器,因?yàn)樵摬僮鞑挥涗浉鱾€(gè)行刪除。
四、TRUNCATE、Drop、Delete區(qū)別
1.drop和delete只是刪除表的數(shù)據(jù)(定義),drop語句將刪除表的結(jié)構(gòu)、被依賴的約束(constrain)、觸發(fā)器 (trigger)、索引(index);依賴于該表的存儲(chǔ)過程/函數(shù)將保留,但是變?yōu)閕nvalid狀態(tài)。
2.delete語句是DML語言,這個(gè)操作會(huì)放在rollback segement中,事物提交后才生效;如果有相應(yīng)的觸發(fā)器(trigger),執(zhí)行的時(shí)候?qū)⒈挥|發(fā)。truncate、drop是DDL語言,操作后即 生效,原數(shù)據(jù)不會(huì)放到rollback中,不能回滾,操作不會(huì)觸發(fā)trigger。
3.delete語句不影響表所占用的extent、高水線(high watermark)保持原位置不動(dòng)。drop語句將表所占用的空間全部釋放。truncate語句缺省情況下將空間釋放到minextents的 extent,除非使用reuse storage。truncate會(huì)將高水線復(fù)位(回到最初)。
4.效率方面:drop > truncate > delete
5.安全性:小心使用drop與truncate,尤其是在 沒有備份的時(shí)候,想刪除部分?jǐn)?shù)據(jù)可使用delete需要帶上where子句,回滾段要足夠大,想刪除表可以用drop,想保留表只是想刪除表的所有數(shù)據(jù)、 如果跟事物無關(guān)可以使用truncate,如果和事物有關(guān)、又或者想觸發(fā) trigger,還是用delete,如果是整理表內(nèi)部的碎片,可以用truncate跟上reuse stroage,再重新導(dǎo)入、插入數(shù)據(jù)。
6.delete是DML語句,不會(huì)自動(dòng)提交。drop/truncate都是DDL語句,執(zhí)行后會(huì)自動(dòng)提交。
7、drop一般用于刪除整體性數(shù)據(jù) 如表,模式,索引,視圖,完整性限制等;delete用于刪除局部性數(shù)據(jù) 如表中的某一元組
8、DROP把表結(jié)構(gòu)都刪了;DELETE只是把數(shù)據(jù)清掉
9、當(dāng)你不再需要該表時(shí), 用 drop;當(dāng)你仍要保留該表,但要?jiǎng)h除所有記錄時(shí), 用 truncate;當(dāng)你要?jiǎng)h除部分記錄時(shí)(always with a WHERE clause), 用 delete.
MYSQL中TRUNCATE和DELETE的區(qū)別
MYSQL中TRUNCATE和DELETE都能夠清理表中的數(shù)據(jù),但是他們有什么區(qū)別呢?我們從下面的幾點(diǎn)來分析:
1. 條件刪除
這個(gè)比較好理解,因?yàn)镈ELETE是可以帶WHERE的,所以支持條件刪除;而TRUNCATE只能刪除整個(gè)表。
# delete - 條件刪除 DELETE FROM student WHERE id = 1; # delete - 刪除整個(gè)表的數(shù)據(jù) DELETE FROM student; # truncate - 刪除整個(gè)表的數(shù)據(jù) TRUNCATE TABLE student;
2. 事務(wù)回滾
由于DELETE是數(shù)據(jù)操作語言(DML - Data Manipulation Language),操作時(shí)原數(shù)據(jù)會(huì)被放到 rollback segment中,可以被回滾;而TRUNCATE是數(shù)據(jù)定義語言(DDL - Data Definition Language),操作時(shí)不會(huì)進(jìn)行存儲(chǔ),不能進(jìn)行回滾。
可以看到DELETE是可以回滾成功的。
可以看到TRUNCATE是不能回滾成功的。
3. 清理速度
在數(shù)據(jù)量比較小的情況下,DELETE和TRUNCATE的清理速度差別不是很大。但是數(shù)據(jù)量很大的時(shí)候就能看出區(qū)別。由于第二項(xiàng)中說的,TRUNCATE不需要支持回滾,所以使用的系統(tǒng)和事務(wù)日志資源少。DELETE 語句每次刪除一行,并在事務(wù)日志中為所刪除的每行記錄一項(xiàng),固然會(huì)慢,但是相對(duì)來說也較安全。
4. 高水位重置
隨著不斷地進(jìn)行表記錄的DML操作,會(huì)不斷提高表的高水位線(HWM),DELETE操作之后雖然表的數(shù)據(jù)刪除了,但是并沒有降低表的高水位,隨著DML操作數(shù)據(jù)庫容量也只會(huì)上升,不會(huì)下降。所以如果使用DELETE,就算將表中的數(shù)據(jù)減少了很多,在查詢時(shí)還是很和DELETE操作前速度一樣。
而TRUNCATE操作會(huì)重置高水位線,數(shù)據(jù)庫容量也會(huì)被重置,之后再進(jìn)行DML操作速度也會(huì)有提升。
MySQL Truncate用法補(bǔ)充
前言:
當(dāng)我們想要清空某張表時(shí),往往會(huì)使用truncate語句。大多時(shí)候我們只關(guān)心能否滿足需求,而不去想這類語句的使用場景及注意事項(xiàng)。本篇文章主要介紹truncate語句的使用方法及注意事項(xiàng)。
1.truncate使用語法
truncate的作用是清空表或者說是截?cái)啾?,只能作用于表。truncate的語法很簡單,后面直接跟表名即可.
例如:truncate table tbl_name
或者 truncate tbl_name
。
執(zhí)行truncate語句需要擁有表的drop權(quán)限,從邏輯上講,truncate table類似于delete刪除所有行的語句或drop table然后再create table語句的組合。為了實(shí)現(xiàn)高性能,它繞過了刪除數(shù)據(jù)的DML方法,因此,它不能回滾。盡管truncate table與delete相似,但它被分類為DDL語句而不是DML語句。
2.truncate與drop,delete的對(duì)比
上面說過truncate與delete,drop很相似,其實(shí)這三者還是與很大的不同的,下面簡單對(duì)比下三者的異同。
- truncate與drop是DDL語句,執(zhí)行后無法回滾;delete是DML語句,可回滾。
- truncate只能作用于表;delete,drop可作用于表、視圖等。
- truncate會(huì)清空表中的所有行,但表結(jié)構(gòu)及其約束、索引等保持不變;drop會(huì)刪除表的結(jié)構(gòu)及其所依賴的約束、索引等。
- truncate會(huì)重置表的自增值;delete不會(huì)。
- truncate不會(huì)激活與表有關(guān)的刪除觸發(fā)器;delete可以。
- truncate后會(huì)使表和索引所占用的空間會(huì)恢復(fù)到初始大??;delete操作不會(huì)減少表或索引所占用的空間,drop語句將表所占用的空間全釋放掉。
3.truncate使用場景及注意事項(xiàng)
通過前面介紹,我們很容易得出truncate語句的使用場景,即該表數(shù)據(jù)完全不需要時(shí)可以用truncate。如果想刪除部分?jǐn)?shù)據(jù)用delete,注意帶上where子句;如果想刪除表,當(dāng)然用drop;如果想保留表而將所有數(shù)據(jù)刪除且和事務(wù)無關(guān),用truncate即可;如果和事務(wù)有關(guān),或者想觸發(fā)trigger,還是用delete;如果是整理表內(nèi)部的碎片,可以用truncate然后再重新插入數(shù)據(jù)。
無論怎樣,truncate表都是高危操作,特別是在生產(chǎn)環(huán)境要更加小心,下面列出幾點(diǎn)注意事項(xiàng),希望大家使用時(shí)可以做下參考。
- truncate無法通過binlog回滾。
- truncate會(huì)清空所有數(shù)據(jù)且執(zhí)行速度很快。
- truncate不能對(duì)有外鍵約束引用的表使用。
- 執(zhí)行truncate需要drop權(quán)限,不建議給賬號(hào)drop權(quán)限。
- 執(zhí)行truncate前一定要再三檢查確認(rèn),最好提前備份下表數(shù)據(jù)。
以上就是MySQL Truncate用法詳解的詳細(xì)內(nèi)容,更多關(guān)于MySQL Truncate的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL常用的日期時(shí)間函數(shù)匯總(附實(shí)例)
日期時(shí)間處理對(duì)大家來說應(yīng)該都不陌生了,下面這篇文章主要給大家介紹了關(guān)于MySQL常用的日期時(shí)間函數(shù),文中通過圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03MySQL數(shù)據(jù)庫主機(jī)127.0.0.1與localhost區(qū)別
這篇文章主要介紹了MySQL主機(jī)127.0.0.1與localhost區(qū)別總結(jié),需要的朋友可以參考下2018-06-06MySQL中使用innobackupex、xtrabackup進(jìn)行大數(shù)據(jù)的備份和還原教程
這篇文章主要介紹了MySQL中使用innobackupex、xtrabackup進(jìn)行大數(shù)據(jù)的備份和還原教程,xtrabackup用來對(duì)超過10G數(shù)據(jù)的Mysql進(jìn)行備份和還原任務(wù),需要的朋友可以參考下2014-09-09MySQL安裝常見報(bào)錯(cuò)處理方法總結(jié)大全
MySQL數(shù)據(jù)庫在安裝或卸載的過程中,常常會(huì)出現(xiàn)一些錯(cuò)誤,這是件讓我們頭疼的事,下面這篇文章主要給大家介紹了關(guān)于MySQL安裝常見報(bào)錯(cuò)處理方法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07