PostgreSQL DELETE

2021-09-10 14:17 更新

DELETE — 刪除一個(gè)表的行

大綱

[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
    [ USING from_item [, ...] ]
    [ WHERE condition | WHERE CURRENT OF cursor_name ]
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

描述

DELETE從指定表中刪除滿(mǎn)足 WHERE子句的行。如果WHERE 子句沒(méi)有出現(xiàn),效果將會(huì)是刪除表中的所有行。結(jié)果是一個(gè)合法的空表。

提示

TRUNCATE提供移除表中所有行的快速機(jī)制。

有兩種方式可以使用數(shù)據(jù)庫(kù)中其他表中包含的信息來(lái)刪除一個(gè)表的行: 使用子選擇或者在USING子句中指定額外的表。 哪種技術(shù)更合適取決于特定的環(huán)境。

可選的RETURNING子句導(dǎo)致DELETE 基于實(shí)際被刪除的每一行計(jì)算并且返回值。任何使用被刪除表列或者 USING中提到的其他表的列的表達(dá)式都可以被計(jì)算。 RETURNING列表的語(yǔ)法和SELECT的 輸出列表語(yǔ)法相同。

要從表中刪除行,你必須具有其上的DELETE特權(quán), 以及USING子句中任何表以及其值在condition中被讀取的表上的 SELECT特權(quán)。

參數(shù)

with_query

WITH子句允許你指定一個(gè)或者多個(gè)子查詢(xún),在 DELETE查詢(xún)中可以用子查詢(xún)的名字來(lái)引用它們。 詳見(jiàn)第 7.8 節(jié)SELECT 。

table_name

要從其中刪除行的表名(可以是模式限定的)。如果在表名前指定 ONLY,只會(huì)從提到的表中刪除匹配的行。如果沒(méi)有指定 ONLY,還會(huì)刪除該表的任何繼承表中的匹配行??蛇x地, 可以在表名后面指定*來(lái)顯式指定要包括繼承表。

alias

目標(biāo)表的一個(gè)別名。提供別名時(shí),它會(huì)完全隱藏該表的真實(shí)名稱(chēng)。例如, 對(duì)于DELETE FROM foo AS fDELETE語(yǔ)句的剩余部分都會(huì)用 f而不是 foo來(lái)引用該表。

from_item

一個(gè)表的表達(dá)式允許在WHERE條件中出現(xiàn) 來(lái)自其他表的列。這使用與SELECT語(yǔ)法的 FROM子句相同的語(yǔ)法; 例如,可以指定表名的別名。除非您希望建立自聯(lián)接(在這種情況下,它必須與 from_item中的別名一起出現(xiàn)),否則不要 將目標(biāo)表重復(fù)為from_item

condition

一個(gè)返回boolean類(lèi)型值的表達(dá)式。只有讓這個(gè) 表達(dá)式返回true的行才將被刪除。

cursor_name

要在WHERE CURRENT OF情況中使用的游標(biāo) 的名稱(chēng)。最近一次從這個(gè)游標(biāo)中取出的行將被刪除。該游標(biāo) 必須是DELETE的目標(biāo)表上的非分組查詢(xún)。 注意不能在使用WHERE CURRENT OF的同時(shí) 指定一個(gè)布爾條件。有關(guān)將游標(biāo)用于 WHERE CURRENT OF的更多信息請(qǐng)見(jiàn) DECLARE 。

output_expression

在每一行被刪除后,會(huì)被DELETE計(jì)算并且返回的表達(dá)式。 該表達(dá)式可以使用table_name 以及USING中的表的任何列。寫(xiě)成*可以返回所有列。

output_name

被返回列的名稱(chēng)。

輸出

在成功完成時(shí),一個(gè)DELETE命令會(huì)返回以下形式 的命令標(biāo)簽:

DELETE count

count是被刪除行的數(shù)目。 注意如果有一個(gè)BEFORE DELETE觸發(fā)器抑制刪除,那么該數(shù)目 可能小于匹配condition 的行數(shù)。如果count為 0, 表示查詢(xún)沒(méi)有刪除行(這并非一種錯(cuò)誤)。

如果DELETE命令包含RETURNING子句, 則結(jié)果會(huì)與包含有RETURNING列表中定義的列和值的 SELECT語(yǔ)句結(jié)果相似,這些結(jié)果是在被該命令刪除的 行上計(jì)算得來(lái)。

注解

通過(guò)在USING子句中指定其他的表, PostgreSQL允許在 WHERE條件中引用其他表的列。例如,要 刪除有一個(gè)給定制片人制作的所有電影,可以這樣做:

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

這里實(shí)際發(fā)生的事情是在filmsproducers之間進(jìn)行連接,然后刪除 所有成功連接的films行。這種語(yǔ)法不 屬于標(biāo)準(zhǔn)。更標(biāo)準(zhǔn)的方式是:

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

在一些情況下,連接形式比子查詢(xún)形式更容易書(shū)寫(xiě)或者執(zhí)行更快。

示例

刪除所有電影,但音樂(lè)劇除外:

DELETE FROM films WHERE kind <> 'Musical';

清空表films

DELETE FROM films;

刪除已完成的任務(wù),返回被刪除行的明細(xì):

DELETE FROM tasks WHERE status = 'DONE' RETURNING *;

刪除tasks中游標(biāo)c_tasks 當(dāng)前位于其上的行:

DELETE FROM tasks WHERE CURRENT OF c_tasks;

兼容性

這個(gè)命令符合SQL標(biāo)準(zhǔn),不過(guò) USINGRETURNING子句是 PostgreSQL擴(kuò)展,在 DELETE中使用WITH也是擴(kuò)展。

又見(jiàn)

TRUNCATE


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)