W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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)。
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 f
, DELETE
語(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ā)生的事情是在films
和 producers
之間進(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ò) USING
和RETURNING
子句是 PostgreSQL擴(kuò)展,在 DELETE
中使用WITH
也是擴(kuò)展。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: