DELETE
DELETE â ÑдалиÑÑ Ð·Ð°Ð¿Ð¸Ñи ÑаблиÑÑ
СинÑакÑиÑ
[ WITH [ RECURSIVE ]запÑоÑ_WITH[, ...] ] DELETE FROM [ ONLY ]имÑ_ÑаблиÑÑ[ * ] [ [ AS ]пÑевдоним] [ USINGÑлеменÑ_FROM[, ...] ] [ WHEREÑÑловие| WHERE CURRENT OFимÑ_кÑÑÑоÑа] [ RETURNING [ WITH ( { OLD | NEW } ASпÑевдоним_ÑезÑлÑÑаÑа[, ...] ) ] { * |вÑÑажение_ÑезÑлÑÑаÑа[ [ AS ]имÑ_ÑезÑлÑÑаÑа] } [, ...] ]
ÐпиÑание
Ðоманда DELETE ÑдалÑÐµÑ Ð¸Ð· Ñказанной ÑаблиÑÑ ÑÑÑоки, ÑдовлеÑвоÑÑÑÑие ÑÑÐ»Ð¾Ð²Ð¸Ñ WHERE. ÐÑли пÑедложение WHERE оÑÑÑÑÑÑвÑеÑ, она ÑдалÑÐµÑ Ð¸Ð· ÑаблиÑÑ Ð²Ñе ÑÑÑоки, в ÑезÑлÑÑаÑе бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑена ÑабоÑаÑ, но пÑÑÑÐ°Ñ ÑаблиÑа.
ÐодÑказка
TRUNCATE ÑеализÑÐµÑ Ð±Ð¾Ð»ÐµÐµ бÑÑÑÑÑй меÑ
анизм ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð²ÑеÑ
ÑÑÑок из ÑаблиÑÑ.
УдалиÑÑ ÑÑÑоки в ÑаблиÑе, иÑполÑзÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸Ð· дÑÑгиÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð² базе даннÑÑ
, можно двÑÐ¼Ñ ÑпоÑобами: пÑименÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе запÑоÑÑ Ð¸Ð»Ð¸ Ñказав дополниÑелÑнÑе ÑаблиÑÑ Ð² пÑедложении USING. ÐÑÐ±Ð¾Ñ Ð¿ÑедпоÑиÑаемого ваÑианÑа завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑнÑÑ
обÑÑоÑÑелÑÑÑв.
ÐÑедложение RETURNING ÑказÑваеÑ, ÑÑо команда DELETE должна вÑÑиÑлиÑÑ Ð¸ возвÑаÑиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑакÑиÑеÑки ÑдалÑнной ÑÑÑоки. ÐÑÑиÑлиÑÑ Ð² нÑм можно лÑбое вÑÑажение Ñо ÑÑолбÑами Ñелевой ÑаблиÑÑ Ð¸/или ÑÑолбÑами дÑÑгиÑ
ÑаблиÑ, ÑпомÑнÑÑÑÑ
в USING. СпиÑок RETURNING Ð¸Ð¼ÐµÐµÑ ÑÐ¾Ñ Ð¶Ðµ ÑинÑакÑиÑ, ÑÑо и ÑпиÑок ÑезÑлÑÑаÑов SELECT.
ЧÑÐ¾Ð±Ñ ÑдалÑÑÑ Ð´Ð°Ð½Ð½Ñе из ÑаблиÑÑ, необÑ
одимо имеÑÑ Ð¿Ñаво DELETE Ð´Ð»Ñ Ð½ÐµÑ, а Ñакже пÑаво SELECT Ð´Ð»Ñ Ð²ÑеÑ
ÑаблиÑ, пеÑеÑиÑленнÑÑ
в пÑедложении USING, и ÑаблиÑ, даннÑе коÑоÑÑÑ
ÑÑиÑÑваÑÑÑÑ Ð² ÑÑловии.
ÐаÑамеÑÑÑ
запÑоÑ_WITHÐÑедложение
WITHпозволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко подзапÑоÑов, на коÑоÑÑе заÑем можно ÑÑÑлаÑÑÑÑ Ð¿Ð¾ имени в запÑоÑеDELETE. ÐодÑобнее об ÑÑом Ñм. Раздел 7.8 и SELECT.имÑ_ÑаблиÑÑÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) ÑаблиÑÑ, из коÑоÑой бÑдÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ñ ÑÑÑоки. ÐÑли пеÑед именем ÑаблиÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾
ONLY, ÑооÑвеÑÑÑвÑÑÑие ÑÑÑоки ÑдалÑÑÑÑÑ ÑолÑко из Ñказанной ÑаблиÑÑ. ÐезONLYÑÑÑоки бÑдÑÑ Ñакже ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¸Ð· вÑÐµÑ ÑаблиÑ, ÑнаÑледованнÑÑ Ð¾Ñ Ñказанной. ÐÑи желании, поÑле имени ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказаÑÑ*, ÑÑÐ¾Ð±Ñ Ñвно обознаÑиÑÑ, ÑÑо опеÑаÑÐ¸Ñ Ð·Ð°ÑÑÐ°Ð³Ð¸Ð²Ð°ÐµÑ Ð²Ñе доÑеÑние ÑаблиÑÑ.пÑевдонимÐлÑÑеÑнаÑивное Ð¸Ð¼Ñ Ñелевой ÑаблиÑÑ. Ðогда ÑказÑваеÑÑÑ ÑÑо имÑ, оно полноÑÑÑÑ ÑкÑÑÐ²Ð°ÐµÑ ÑакÑиÑеÑкое Ð¸Ð¼Ñ ÑаблиÑÑ. ÐапÑимеÑ, в запÑоÑе
DELETE FROM foo AS fдополниÑелÑнÑе компоненÑÑ Ð¾Ð¿ÐµÑаÑоÑаDELETEÐ´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº Ñелевой ÑаблиÑе по имениf, а неfoo.ÑлеменÑ_FROMТаблиÑное вÑÑажение, позволÑÑÑее добавиÑÑ Ð² ÑÑловие
WHEREÑÑолбÑÑ Ð¸Ð· дÑÑÐ³Ð¸Ñ ÑаблиÑ. Ð ÑÑом вÑÑажении иÑполÑзÑеÑÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑинÑакÑиÑ, ÑÑо и в пÑедложенииFROMопеÑаÑоÑаSELECT; напÑимеÑ, в нÑм можно опÑеделиÑÑ Ð¿Ñевдоним Ð´Ð»Ñ ÑаблиÑÑ. ÐовÑоÑÑÑÑ Ð² нÑм Ð¸Ð¼Ñ Ñелевой ÑаблиÑÑ Ð½Ñжно, ÑолÑко еÑли ÑÑебÑеÑÑÑ Ð¾Ð¿ÑеделиÑÑ Ð·Ð°Ð¼ÐºÐ½ÑÑое Ñоединение (в ÑÑом ÑлÑÑае Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ имени должен опÑеделÑÑÑÑÑ Ð¿Ñевдоним).ÑÑловиеÐÑÑажение, возвÑаÑаÑÑее знаÑение Ñипа
boolean. Ð£Ð´Ð°Ð»ÐµÐ½Ñ Ð±ÑдÑÑ ÑолÑко Ñе ÑÑÑоки, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ ÑÑо вÑÑажение возвÑаÑаеÑtrue.имÑ_кÑÑÑоÑаÐÐ¼Ñ ÐºÑÑÑоÑа, коÑоÑÑй бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² ÑÑловии
WHERE CURRENT OF. С Ñаким ÑÑловием бÑÐ´ÐµÑ Ñдалена ÑÑÑока, вÑбÑÐ°Ð½Ð½Ð°Ñ Ð¸Ð· ÑÑого кÑÑÑоÑа поÑледней. ÐÑÑÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ обÑазовÑваÑÑÑÑ Ð·Ð°Ð¿ÑоÑом, не пÑименÑÑÑим гÑÑппиÑовкÑ, к Ñелевой ÑаблиÑе командÑDELETE. ÐамеÑÑÑе, ÑÑоWHERE CURRENT OFнелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð²Ð¼ÐµÑÑе Ñ Ð»Ð¾Ð³Ð¸ÑеÑким ÑÑловием. Ðа дополниÑелÑнÑми ÑведениÑми об иÑполÑзовании кÑÑÑоÑов ÑWHERE CURRENT OFобÑаÑиÑеÑÑ Ðº DECLARE.пÑевдоним_ÑезÑлÑÑаÑаÐеобÑзаÑелÑнÑй пÑевдоним Ð´Ð»Ñ ÑÑÑок
OLDилиNEWв ÑпиÑкеRETURNING.Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑаÑÑе знаÑÐµÐ½Ð¸Ñ Ð¸Ð· Ñелевой ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
OLD.илиимÑ_ÑÑолбÑаOLD.*, а новÑе â Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑNEW.илиимÑ_ÑÑолбÑаNEW.*. ÐÑли Ð·Ð°Ð´Ð°Ð½Ñ Ð¿ÑевдонимÑ, ÑÑи имена недоÑÑÑпнÑ, и обÑаÑаÑÑÑÑ Ðº знаÑениÑм нÑжно ÑеÑез пÑевдонимÑ, напÑимеÑRETURNING WITH (OLD AS o, NEW AS n) o.*, n.*.вÑÑажение_ÑезÑлÑÑаÑаÐÑÑажение, коÑоÑое бÑÐ´ÐµÑ Ð²ÑÑиÑлÑÑÑÑÑ Ð¸ возвÑаÑаÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹
DELETEпоÑле ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки. Ð ÑÑом вÑÑажении можно иÑполÑзоваÑÑ Ð¸Ð¼ÐµÐ½Ð° лÑбÑÑ ÑÑолбÑов ÑаблиÑÑимÑ_ÑаблиÑÑили ÑаблиÑ, пеÑеÑиÑленнÑÑ Ð² ÑпиÑкеUSING. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð²Ñе ÑÑолбÑÑ, доÑÑаÑоÑно напиÑаÑÑ*.ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑаÑÑе или новÑе знаÑениÑ, можно дополниÑÑ Ð¸Ð¼Ñ ÑÑолбÑа или
*Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑOLDилиNEWили ÑооÑвеÑÑÑвÑÑÑегопÑевдонима_ÑезÑлÑÑаÑадлÑOLDилиNEW. ÐÑи иÑполÑзовании имени ÑÑолбÑа без дополнений или же имени ÑÑолбÑа или*, дополненнÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ или пÑевдонимом Ñелевой ÑаблиÑÑ, возвÑаÑаÑÑÑÑ ÑÑаÑÑе знаÑениÑ.ÐÐ»Ñ Ð¿ÑоÑÑой опеÑаÑии
DELETEвÑе новÑе знаÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑNULL. Ðднако еÑли пÑавилоON DELETEвÑзÑÐ²Ð°ÐµÑ Ð²ÑполнениеINSERTилиUPDATE, новÑе знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¾ÑлиÑнÑми оÑNULL.имÑ_ÑезÑлÑÑаÑаÐмÑ, назнаÑаемое возвÑаÑÐ°ÐµÐ¼Ð¾Ð¼Ñ ÑÑолбÑÑ.
ÐÑÐ²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð¸Ð½ÑоÑмаÑиÑ
Ð ÑлÑÑае ÑÑпеÑного завеÑÑениÑ, DELETE возвÑаÑÐ°ÐµÑ Ð¼ÐµÑÐºÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² виде
DELETE ÑиÑло
ÐдеÑÑ ÑиÑло â колиÑеÑÑво ÑдалÑннÑÑ
ÑÑÑок. ÐамеÑÑÑе, ÑÑо ÑÑо ÑиÑло Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼ÐµÐ½ÑÑе ÑиÑла ÑÑÑок, ÑооÑвеÑÑÑвÑÑÑиÑ
ÑÑловиÑ, еÑли ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð±Ñли Ð¿Ð¾Ð´Ð°Ð²Ð»ÐµÐ½Ñ ÑÑиггеÑом BEFORE DELETE. ÐÑли ÑиÑло Ñавно 0, ÑÑо ознаÑаеÑ, ÑÑо запÑÐ¾Ñ Ð½Ðµ Ñдалил ни одной ÑÑÑоки (ÑÑо не ÑÑиÑаеÑÑÑ Ð¾Ñибкой).
ÐÑли команда DELETE ÑодеÑÐ¶Ð¸Ñ Ð¿Ñедложение RETURNING, ÐµÑ ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾Ñ
ож на ÑезÑлÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑоÑа SELECT (Ñ Ñеми же ÑÑолбÑами и знаÑениÑми, ÑÑо ÑодеÑжаÑÑÑ Ð² ÑпиÑке RETURNING), полÑÑеннÑй Ð´Ð»Ñ ÑÑÑок, ÑдалÑннÑÑ
ÑÑой командой.
ÐÑимеÑаниÑ
PostgreSQL позволÑÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° ÑÑолбÑÑ Ð´ÑÑгиÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð² ÑÑловии WHERE, когда ÑÑи ÑаблиÑÑ Ð¿ÐµÑеÑиÑлÑÑÑÑÑ Ð² пÑедложении USING. ÐапÑимеÑ, ÑдалиÑÑ Ð²Ñе ÑилÑÐ¼Ñ Ð¾Ð¿ÑеделÑнного пÑодÑÑеÑа можно Ñак:
DELETE FROM films USING producers WHERE producer_id = producers.id AND producers.name = 'foo';
Ðо ÑÑÑи в ÑÑом запÑоÑе вÑполнÑеÑÑÑ Ñоединение ÑÐ°Ð±Ð»Ð¸Ñ films и producers, и вÑе ÑÑпеÑно вклÑÑÑннÑе в Ñоединение ÑÑÑоки в films помеÑаÑÑÑÑ Ð´Ð»Ñ ÑдалениÑ. ÐÑÐ¾Ñ ÑинÑакÑÐ¸Ñ Ð½Ðµ ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ. СледÑÑ ÑÑандаÑÑÑ, ÑÑÑ Ð·Ð°Ð´Ð°ÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑеÑиÑÑ Ñак:
DELETE FROM films WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');
Ð ÑÑде ÑлÑÑаев запÑÐ¾Ñ Ð² ÑÑиле ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð»ÐµÐ³Ñе напиÑаÑÑ Ð¸ он Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ Ð±ÑÑÑÑее, Ñем в ÑÑиле вложенного запÑоÑа.
ÐÑимеÑÑ
Удаление вÑÐµÑ ÑилÑмов, кÑоме мÑзиклов:
DELETE FROM films WHERE kind <> 'Musical';
ÐÑиÑÑка ÑаблиÑÑ films:
DELETE FROM films;
Удаление завеÑÑÑннÑÑ Ð·Ð°Ð´Ð°Ñ Ñ Ð¿Ð¾Ð»ÑÑением вÑÐµÑ Ð´Ð°Ð½Ð½ÑÑ ÑдалÑннÑÑ ÑÑÑок:
DELETE FROM tasks WHERE status = 'DONE' RETURNING *;
Удаление из tasks ÑÑÑоки, на коÑоÑой в ÑекÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑаÑполагаеÑÑÑ ÐºÑÑÑÐ¾Ñ c_tasks:
DELETE FROM tasks WHERE CURRENT OF c_tasks;
ÐеÑмоÑÑÑ Ð½Ð° оÑÑÑÑÑÑвие пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ LIMIT Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ DELETE, можно огÑаниÑиÑÑ ÑиÑло ÑдалÑемÑÑ
ÑÑÑок, иÑполÑзовав меÑод в опиÑании ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE:
WITH delete_batch AS (
SELECT l.ctid FROM user_logs AS l
WHERE l.status = 'archived'
ORDER BY l.creation_date
FOR UPDATE
LIMIT 10000
)
DELETE FROM user_logs AS dl
USING delete_batch AS del
WHERE dl.ctid = del.ctid;СовмеÑÑимоÑÑÑ
ÐÑа команда ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ SQL, но пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ USING и RETURNING ÑвлÑÑÑÑÑ ÑаÑÑиÑениÑми PostgreSQL, как и возможноÑÑÑ Ð¸ÑполÑзоваÑÑ WITH Ñ DELETE.