DELETE

Name

DELETE -- 刪除一個資料表中的行

Synopsis

DELETE FROM [ ONLY ] table [ WHERE condition ]

描述

DELETE 從指明的資料表裡刪除滿足 WHERE 子句的行。 如果 WHERE 子句不存在, 效果是刪除資料表中所有行。結果是一個有效的空資料表。

提示: TRUNCATE 是一個 PostgreSQL 擴展, 它提供一個更快的從資料表中刪除所有行的機制。

預設時 DELETE 將刪除所聲明的資料表和所有它的子資料表的記錄。 如果您希望只更新提到的資料表,您應該使用 ONLY 子句。

要對資料表進行刪除,您必須對它有 DELETE 權限, 同樣也必須有 SELECT 的權限,這樣才能對符合 condition 的值進行讀取操作。

參數

table

一個現存資料表的名字(可以有模式修飾)。

condition

一個返回 boolean 類型值的值資料表達式,它判斷哪些行需要被刪除。

輸出

成功時,DELETE 命令返回形如

DELETE count

的標籤。 count 是被刪除的行數。 如果 count 為 0,沒有行匹配 condition (這個不認為是錯誤)。

注意

PostgreSQL 讓您在 WHERE 條件裡引用其它資料表的字串。 比如,要刪除給出製片商製作的所有電影,我們可以

DELETE FROM films
  WHERE producer_id = producers.id AND producers.name = 'foo';

這裡實際發生的事情是在 filmsproducers 之間的一個連接, 然後所有成功連接的 films 行都標記為刪除。

DELETE FROM films
  WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');

有時候連接風格比子查詢風格更容易寫或者執行更快。 一個反對連接風格的意見是,在查詢裡沒有明確地列出使用哪些資料表, 這樣就令這種風格比較容易出錯;並且它也無法處理自連接。

例子

刪除所有電影(films)但不刪除音樂(musicals):

DELETE FROM films WHERE kind <> 'Musical';

清空資料表 films

DELETE FROM films;
SELECT * FROM films;

相容性

這條命令遵循 SQL 標準,但是在 WHERE 子句裡面引用其它資料表的能力是 PostgreSQL 的擴展。