刪除vs截斷
Drop和Truncate是數據庫管理系統中使用的兩個SQL(結構化查詢語言)語句,我們希望從數據庫中刪除數據記錄。Drop和Truncate語句都會刪除表中的整個數據和相關的SQL語句。在這種情況下,Delete操作無效,因為它比Drop和Truncate佔用更多的存儲空間。
如果我們想放棄數據庫中的一個表及其所有數據,SQL允許我們使用Drop語句輕鬆地執行此操作。Drop命令是一個DDL(數據定義語言)命令,可用於銷燬現有的數據庫、表、索引或視圖。它從數據庫中刪除表中的全部信息以及表結構。另外,我們可能希望簡單地刪除表中的所有數據,但是沒有表,在這種情況下,我們可以在SQL中使用Truncate語句。Truncate也是一個DDL命令,它消除了表中的所有行,但保留了相同的表定義以供將來使用。
Drop命令
如前所述,Drop命令刪除表定義及其所有數據、完整性約束、索引、觸發器和訪問特權,這些都是在特定表上創建的。因此,它會從數據庫中完全刪除現有對象,並且在執行命令後,與其他表的關係也將不再有效。它還從數據字典中刪除有關表的所有信息。下面是對錶使用Drop語句的典型語法。
刪除表格<;表格名稱>;
我們只需替換上面Drop命令示例中要從數據庫中刪除的表名。
必須指出的是,Drop語句不能用於刪除已被外鍵約束引用的表。在這種情況下,必須首先刪除引用外鍵約束或該特定表。此外,Drop語句不能應用於數據庫中的系統表。
由於Drop命令是一個auto commit語句,一旦觸發操作就不能回滾,也不會觸發觸發器。當刪除一個表時,對該表的所有引用都將無效,因此,如果我們想再次使用該表,則必須使用所有完整性約束和訪問權限重新創建該表。所有與其他表的關係,也必須重新定位。
截斷命令
Truncate命令是一個DDL命令,它刪除表中的所有行而不使用任何用戶指定的條件,並釋放表使用的空間,但表結構及其列、索引和約束保持不變。Truncate通過取消分配用於存儲表數據的數據頁來消除表中的數據,並且只有這些頁釋放保留在事務日誌中。因此,與Delete等其他相關SQL命令相比,它使用的事務日誌資源和系統資源更少。所以Truncate語句比其他語句快一點。以下是Truncate命令的典型語法。
截斷表格<;表格名稱>;
我們應該用上面的語法替換要從中刪除整個數據的表名。
不能對已被外鍵約束引用的表使用Truncate。它在操作之前自動使用一個提交,然後再使用另一個提交,所以事務的回滾是不可能的,並且不會觸發觸發器。如果我們想重用表,我們只需要訪問數據庫中現有的表定義。
Drop和Truncate有什麼區別?
Drop和Truncate命令都是DDL命令,也是自動提交語句,因此無法回滾使用這些命令執行的事務。
Drop和Truncate之間的主要區別是Drop命令不僅刪除表中的所有數據,而且還會從數據庫中永久刪除包含所有引用的表結構,而Truncate命令只刪除表中的所有行,並保留表結構及其引用。
如果刪除一個表,與其他表的關係將不再有效,並且完整性約束和訪問權限也將被刪除。因此,如果需要重用表,則必須使用關係、完整性約束以及訪問權限來重新構建表。但是,如果表被截斷,表結構及其約束將保留以備將來使用,因此,重用時不需要上述任何重新創建。