SQL 中 TRUNCATE 和 DELETE 的差異
在 SQL 中刪除表格資料時,TRUNCATE 和 DELETE 提供了兩種選擇。理解它們的不同特性對於做出明智的決策至關重要。
總體概述
如果目的是快速刪除表中所有行且無需保留任何數據,TRUNCATE 通常比 DELETE 更快。但是,也應考慮特定係統的因素。
語句類型
TRUNCATE 被歸類為資料定義語言 (DDL) 語句,而 DELETE 是資料操弄語言 (DML) 語句。這種區別會影響它們在某些上下文中的行為。
提交與回滾
取決於資料庫廠商,TRUNCATE 可能是可回滾的,也可能不是。 PostgreSQL 和 SQL*Server 允許回滾 TRUNCATE,而 Oracle 將其視為已提交的操作。
空間回收
TRUNCATE 透過釋放已指派的資料段來回收儲存空間。另一方面,DELETE 保留已刪除行所佔用的空間。
行範圍
TRUNCATE 刪除表中的所有行,而 DELETE 可以根據條件來定位特定行。
物件類型
TRUNCATE 可套用於資料表或整個叢集(特定於廠商)。 DELETE 適用於表格和叢集中的表。
資料物件識別
在 Oracle 中,DELETE 不影響資料物件 ID,但 TRUNCATE 會指派一個新的 ID,除非表中先前有過資料插入。
閃回 (Oracle)
DELETE 支援閃回,允許從先前狀態恢復資料。另一方面,TRUNCATE 阻止對截斷之前的狀態進行閃回操作。但是,Oracle 11gR2 的 FLASHBACK ARCHIVE 功能可以減輕這個問題。
權限
授予 TRUNCATE 權限的能力因廠商而異。 Oracle 需要 DROP ANY TABLE 權限,而其他系統可能允許將此權限授予特定使用者或角色。
索引
Oracle 中的 TRUNCATE 會重新啟用不可用的索引。 DELETE 沒有此效果。
外鍵
如果存在對錶的活動外鍵引用,則無法執行 TRUNCATE。 DELETE 的行為取決於外鍵的配置。
觸發器
DDL 觸發器可以被 TRUNCATE 操作激活,而 DML 觸發器不會被觸發。
遠端執行
在 Oracle 中,無法透過資料庫連結執行 TRUNCATE。
識別列
在 SQL*Server 中,TRUNCATE 會重設 IDENTITY 欄位的序列,而 DELETE 則不會。
以上是SQL 中的 TRUNCATE 與 DELETE:我什麼時候應該使用哪一個?的詳細內容。更多資訊請關注PHP中文網其他相關文章!