你們都知道,在MySQL中刪除一個表中的記錄有兩種方法,一種是DELETE FROM TABLENAME WHERE... , 還有一種是TRUNCATE TABLE TABLENAME。sql
DELETE FROM設計
從 MySQL 數據表中刪除數據,若是沒有指定 WHERE 子句,MySQL 表中的全部記錄將被刪除。能夠在 WHERE 子句中指定任何條件。日誌
語法:blog
DELETE FROM table_name WHERE column_name = some_value
TRUNCATE TABLE TABLENAME索引
刪除表中的全部行,而不記錄單個行刪除操做。事務
語法:table
TRUNCATE TABLE TABLENAME
區別:程序設計
1)DELETE FROM語句可使用WHERE 對要刪除的記錄進行選擇,TRUNCATE TABLE 將刪除表中的全部記錄,so,DELETE FROM更靈活。class
2)若是DELETE FROM 不加WHERE條件,那麼他和TRUNCATE TABLE 是同樣的,惟一的區別就是DELETE FROM刪除後返回被刪除的記錄數,而TRUNCATE TABLE返回的是0。語法
3)若是一個表中有自增的字段,這時使用DELETE和TRUNCATE刪除表中全部數據時,若是表中有自增字段,則自增字段將起始值恢復爲1,若是不想恢復,則能夠在DELETE時加上WHERE的永真條件,使用DELETE FROM TABLENAME WHERE 1便可,但在這樣作時會有一些缺點,即掃描表中的每一行記錄,因此雖然能夠保持自增的最大值,但他的執行成本要比沒有WHERE條件的DELETE以及TRUNCATE大得多的多。
4)當表中的數據比較多時,刪除全表數據建議使用TRUNCATE TABLE,TRUNCATE TABLE經過釋放存儲表數據所用的數據頁來刪除數據,而且只在事務日誌中記錄頁的釋放,而DELETE FROM則是將數據一行一行的刪除,每刪除一行,還要在事務日誌中爲所刪除的行記錄一項,賊慢。
5)TRUNCATE TABLE刪除後沒法ROLLBACK,緣由:TRUNCATE是一個DDL語句,將被隱式提交,不能使用ROLLBACK命令,而DELETE是DML語句,能夠ROLLBACK(前提是DELETE操做沒有COMMIT)
注:SQL語言包括四種主要程序設計語言類別的語句:
數據定義語言(DDL)主要表現爲建立刪除表,建立索引等;
數據操做語言(DML)主要表現爲對數據的追加,更新查詢;
數據控制語言(DCL)主要表現爲受權(GRANT),撤銷受權(REVOKE),拒絕受權(DENY);
事務控制語言(TCL)主要表現爲設置保存點(SAVEPOINT),回滾(ROLLBACK),提交(COMMIT)。
總結:
DELETE能夠經過WHERE語句選擇要刪除的記錄,但執行得速度不快,能夠返回被刪除的記錄數,在未提交狀況下能夠回滾。而TRUNCATE TABLE沒法刪除指定的記錄,並且不能返回被刪除的記錄。但它執行得很是快。