截斷

維基百科,自由的百科全書
(重新導向自Truncate
跳至導覽 跳至搜尋

SQL中,TRUNCATE TABLE陳述式是一種數據操縱語言 (DML) 操作,用於刪除表中的所有行,且不會觸發觸發器(Trigger)。該操作的結果是快速移除表中的所有數據,通常會繞過許多完整性強制機制。它在SQL:2008英語SQL:2008標準中被正式引入。

TRUNCATE TABLE刪除表中的所有行,但保留表結構及列、約束、索引等。若要刪除表定義及其數據,使用DROP TABLE陳述式。

TRUNCATE TABLE mytable在邏輯上(而非物理上)等同於不帶WHERE子句的 DELETE FROM mytable。TRUNCATE與DELETE的區分:

  • 事務處理(Oracle/MySQL):在Oracle資料庫中,TRUNCATE 在執行前後會隱式執行commit提交)操作。
  • 效能與開銷:通常,TRUNCATE TABLE通過釋放表所佔用的數據頁來快速刪除所有記錄。這減少了記錄刪除紀錄檔(Logging)的資源開銷,並減少了取得鎖(Locks)的數量。以這種方式移除的記錄無法通過rollback(轉返)操作恢復。註:PostgreSQLMicrosoft SQL Server是兩個例外,它們允許在事務內對 TRUNCATE 進行提交或轉返。
  • 限制條件:TRUNCATE TABLE 陳述式中不能指定 WHERE 子句。
  • 外來鍵約束:當表被外來鍵參照時,不能使用TRUNCATE,因為該陳述式不會啟用ON DELETE/ON UPDATE觸發器,這可能導致數據不一致。
  • 自增列重設:在某些系統中,TRUNCATE會將自增列(Identity column)的計數重設回初始種子值。

相容性問題[編輯]

  • 由於SQL-92的標準並沒有「Truncate」這個SQL關鍵字,故於早期的SQL相容資料庫,並不支援此SQL語法。如果要達到相近的刪除功能,只能用無條件的DELETE語法。(但自動遞增值的欄位,不會自動重設計數。)

外部連結[編輯]