Postgresql
刪除其他表中未引用的行
我在 PostgreSQL 9.3 數據庫中有兩個表: Table
link_reply
有一個名為which_group
指向 table的外鍵link_group
。我想刪除不存在
link_group
相關行的所有行link_reply
。聽起來很基本,但我一直在努力。它會像這樣簡單(不起作用)嗎?
DELETE FROM link_group WHERE link_reply = NULL;
使用數據庫中其他表中包含的資訊刪除表中的行有兩種方法:使用子選擇,或在
USING
子句中指定附加表。哪種技術更合適取決於具體情況。大膽強調我的。使用不包含在另一個表中的資訊有點棘手,但有一些簡單的解決方案。從標準技術庫到…
…
NOT EXISTS
反半連接可能是最簡單和最有效的DELETE
:DELETE FROM link_group lg WHERE NOT EXISTS ( SELECT FROM link_reply lr WHERE lr.which_group = lg.link_group_id );
假設(因為未提供表定義)
link_group_id
作為主鍵的列名link_group
。@Mihai 評論的技術也有效(正確應用):
DELETE FROM link_group lg USING link_group lg1 LEFT JOIN link_reply lr ON lr.which_group = lg1.link_group_id WHERE lg1.link_group_id = lg.link_group_id AND lr.which_group IS NULL;
但是由於
USING
子句中的表表達式使用 a 連接到目標表(lg
在範例中)CROSS JOIN
,因此您需要同一個表的另一個實例作為 的墊腳石(lg1
在範例中)LEFT JOIN
,這不太優雅並且通常更慢。