跳轉到內容

結構化查詢語言/DELETE 2

來自華夏公益教科書



提示:請小心並停用 AUTOCOMMIT.

因為 DELETE 命令刪除整行而不是部分行,所以語法很簡單。其結構在 上一頁 中展示過。本頁只增加了一點:WHERE 子句不僅限於簡單的條件,如 'id = 10',還可以包含子查詢。這使得命令更加靈活。

在 DELETE 命令中使用子查詢與在 UPDATESELECT 命令中使用子查詢相同。

還有另一個刪除行的命令。 TRUNCATE 命令與 DELETE 非常相似。TRUNCATE 刪除表的 所有 行,並且效能更好。但是它沒有機制來選擇單個行。

該示例命令刪除出生在舊金山的聯絡人的資訊。

-- Delete rows depending on a criteria which resides in a different table.
DELETE FROM contact
WHERE  person_id IN
  (SELECT id
   FROM   person
   WHERE  place_of_birth = 'San Francisco'
  );

-- It's only a test. Restore the rows.
ROLLBACK;

相關子查詢與 DELETE 命令的組合不被所有實現支援。

DBMS 通常會拒絕 DELETE 命令,因為外部索引鍵約束將在執行期間被違反。例如:如果命令嘗試刪除已知聯絡人或愛好資訊的個人,該命令將失敗(整體失敗)。為了克服這種情況,有幾種不同的策略:

  • 在刪除目標行之前刪除所有依賴行。
  • 將外部索引鍵約束定義為 DEFERRED(在 COMMIT 之前不會檢查),並在目標行之前或之後刪除依賴行。
  • 將外部索引鍵約束定義為 CASCADE。在這種情況下,依賴行將被自動刪除。

刪除 Goldstein 家族的愛好資訊。

點選檢視答案
DELETE FROM person_hobby
WHERE  person_id IN
  (SELECT id
   FROM   person
   WHERE  lastname = 'Goldstein'
  );

-- Refrain from deleting the hobby itself - because:
--   a) The hobby may be allocated to a different person.
--   b) After the information in person_hobby is deleted, there is no longer the possibility to get
--      to old assignment between person and hobby.

-- It's only a test. Restore the rows.
ROLLBACK;


華夏公益教科書