?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
DELETE FROM [ ONLY ] table [ [ AS ] alias ] [ USING using_list ] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
DELETE從指定的表里刪除滿足WHERE子句的行。 如果WHERE子句不存在,將刪除表中所有行。結(jié)果是一個(gè)有效的空表。
Tip: TRUNCATE 是一個(gè)PostgreSQL擴(kuò)展, 它提供一個(gè)更快的從表中刪除所有行的機(jī)制。
缺省時(shí)DELETE將刪除所聲明的表及其所有子表的記錄。如果你希望只刪除指定的表, 你應(yīng)該使用ONLY子句。
使用數(shù)據(jù)庫(kù)中其它表的信息刪除某個(gè)表中的數(shù)據(jù)行有兩個(gè)辦法:使用子查詢, 或者在USING子句中聲明額外的表。哪種技巧更合適取決于特定的環(huán)境。
可選的RETURNING子句將使得DELETE計(jì)算并返回實(shí)際被刪除了的行。 任何使用表字段的表達(dá)式和/或USING中提到的其他表的字段,都可以用于計(jì)算。 RETURNING列表的語(yǔ)法和SELECT輸出列表的語(yǔ)法相同。
要對(duì)表進(jìn)行刪除,你必須對(duì)它有DELETE權(quán)限, 同樣也必須有USING子句的表以及condition 上讀取的表的SELECT權(quán)限。
如果聲明了這個(gè)選項(xiàng),則只從指定的表中刪除數(shù)據(jù)行。否則從指定的表及其所有子表中的刪除。
一個(gè)現(xiàn)存表的名字(可以有模式修飾)
目標(biāo)表的別名。如果提供了別名,那么它將完全掩蓋實(shí)際的表名。例如給定DELETE FROM foo AS f之后,DELETE語(yǔ)句的剩余部分必須使用f而不是foo來(lái)引用該表。
表表達(dá)式列表,允許來(lái)自其他表的列出現(xiàn)在WHERE條件中。這與可以在SELECT命令的FROM子句子句 中指定的表列表相似。例如,可以為該表的名字聲明一個(gè)別名。不要在using_list里重復(fù)目標(biāo)表,除非你希望產(chǎn)生一個(gè)自連接。
返回一個(gè)boolean類(lèi)型值的表達(dá)式。僅僅對(duì)于表達(dá)式返回true的行進(jìn)行刪除。
在WHERE CURRENT OF環(huán)境下使用的游標(biāo)的名稱(chēng)。要?jiǎng)h除的行是一個(gè)最近從這個(gè)游標(biāo) 獲取的。游標(biāo)必須是DELETE目標(biāo)表上的一個(gè)非分組查詢。請(qǐng)注意: WHERE CURRENT OF不能與一個(gè)布爾類(lèi)型一同聲明。請(qǐng)參閱DECLARE 獲取更多關(guān)于使用帶WHERE CURRENT OF的游標(biāo)的更多詳細(xì)信息。
在每行刪除后,通過(guò)DELETE命令來(lái)計(jì)算和返回的表達(dá)式。表達(dá)式可以使用 table的任意列名或者USING中 列出的任意表。寫(xiě)*來(lái)返回所有列。
用于返回列的一個(gè)名稱(chēng)。
成功時(shí),DELETE 命令返回形如
DELETE count
count是被刪除的行數(shù)。如果為 0 則表示沒(méi)有行匹配 condition,這個(gè)不認(rèn)為是錯(cuò)誤。
如果DELETE命令包含一個(gè)RETURNING子句,那么其結(jié)果非常類(lèi)似于 SELECT語(yǔ)句基于RETURNING子句中包含的字段和值列表的結(jié)果, 只是基于被刪除的行進(jìn)行計(jì)算而已。
PostgreSQL允許你在WHERE條件里引用其它表的字段, 方法是在USING子句里聲明其它表。比如,要?jiǎng)h除給出制片商制作的所有電影, 可以這樣做:
DELETE FROM films USING producers WHERE producer_id = producers.id AND producers.name = 'foo';
這里實(shí)際發(fā)生的事情是在films和producers之間的一個(gè)連接, 然后所有成功連接的films行都標(biāo)記為刪除。這個(gè)語(yǔ)法不是標(biāo)準(zhǔn)的,更標(biāo)準(zhǔn)的語(yǔ)法是這么做:
DELETE FROM films WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');
有時(shí)候連接風(fēng)格比子查詢風(fēng)格更容易寫(xiě)或者執(zhí)行更快。
刪除所有電影(films)但不刪除音樂(lè)(musicals):
DELETE FROM films WHERE kind <> 'Musical';
清空films表:
DELETE FROM films;
從 tasks 表及其子表中刪除,并返回所有被刪除的行:
DELETE FROM tasks WHERE status = 'DONE' RETURNING *;
刪除tasks的行,游標(biāo)當(dāng)前就放置在c_tasks上:
DELETE FROM tasks WHERE CURRENT OF c_tasks;
這條命令遵循SQL標(biāo)準(zhǔn),但是USING和RETURNING 子句是PostgreSQL的擴(kuò)展。