Postgresql

刪除其他表中未引用的行

  • August 28, 2019

我在 PostgreSQL 9.3 數據庫中有兩個表: Tablelink_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,這不太優雅並且通常更慢。

引用自:https://dba.stackexchange.com/questions/134221