結構化查詢語言/DELETE 2
外觀
< 結構化查詢語言
提示:請小心並停用 AUTOCOMMIT.
因為 DELETE 命令刪除整行而不是部分行,所以語法很簡單。其結構在 上一頁 中展示過。本頁只增加了一點:WHERE 子句不僅限於簡單的條件,如 'id = 10',還可以包含子查詢。這使得命令更加靈活。
在 DELETE 命令中使用子查詢與在 UPDATE 或 SELECT 命令中使用子查詢相同。
還有另一個刪除行的命令。 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;