在資料庫操作中,刪除資料表所有資料是常見需求。許多開發者會困惑:DELETE FROM table_name 與 DELETE * FROM table_name 兩種寫法有何不同?哪種符合 SQL 標準?為什麼某些資料庫支援後者?本文將深入探討這兩種語法的差異、標準合規性及實際應用建議。
根據 ANSI SQL 標準,DELETE 陳述式的標準語法為 DELETE FROM table_name [WHERE condition]。標準中不包含星號(*)符號。因此,DELETE * FROM table_name 並非標準 SQL 語法。
然而,部分資料庫管理系統(如 Microsoft Access、SQL Server 的某些版本)為了兼容性或歷史原因,允許使用 DELETE * FROM table_name。這種寫法在功能上等同於 DELETE FROM table_name,皆會刪除資料表中的所有列(若無 WHERE 子句)。
DELETE FROM table_name 刪除所有資料後,標識列的種子值不會重置;下一次插入資料時,標識值將從刪除前的最大值+1 繼續增長。若需重置標識列,應使用 TRUNCATE TABLE(若資料庫支援)。DELETE 會逐行記錄並觸發 DELETE 觸發器,而 TRUNCATE TABLE 則不會觸發觸發器且速度更快。DELETE 會在交易日誌中記錄每一行刪除操作,大量資料刪除時日誌增長迅速;TRUNCATE TABLE 僅記錄頁面釋放,效能優越。DELETE FROM table_name,確保跨資料庫可移植性。TRUNCATE TABLE table_name(需確認權限及外鍵約束)。DELETE * FROM table_name,以免遷移時出現相容性問題。DELETE * FROM table_name 非 SQL 標準,僅部分資料庫支援。兩者功能相同,但標準寫法更具可移植性。大量刪除資料時,應評估 TRUNCATE TABLE 以獲得更好效能與標識列重置行為。