大家都知道,在MySQL中刪除一個表中的記錄有兩種方法,一種是DELETE FROM TABLENAME WHERE... , 還有一種是TRUNCATE TABLE TABLENAME。 DELETE FROM 從 MySQL 數據表中刪除數據,如果沒有指定 WHERE 子句,MySQL 表中的所 ...
大家都知道,在MySQL中刪除一個表中的記錄有兩種方法,一種是DELETE FROM TABLENAME WHERE... , 還有一種是TRUNCATE TABLE TABLENAME。
DELETE FROM
從 MySQL 數據表中刪除數據,如果沒有指定 WHERE 子句,MySQL 表中的所有記錄將被刪除。可以在 WHERE 子句中指定任何條件。
語法:
DELETE FROM table_name WHERE column_name = some_value
TRUNCATE TABLE TABLENAME
刪除表中的所有行,而不記錄單個行刪除操作。
語法:
TRUNCATE TABLE TABLENAME
區別:
1)DELETE FROM語句可以使用WHERE 對要刪除的記錄進行選擇,TRUNCATE TABLE 將刪除表中的所有記錄,so,DELETE FROM更靈活。
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無法刪除指定的記錄,而且不能返回被刪除的記錄。但它執行得非常快。