Postgresql

如何獲得用作 FK 的 PK 數量?

  • March 27, 2019

如何獲得用作 FK 的 PK 數量?

表 1 有一個列 ID (PK)。表 2 和 3 有一個列 ID(FK - 指表 1 PK)。

如何在不參考表 2 或表 3 的情況下獲得表 2 和表 3 中使用的值 1(PK)?

SELECT id 
FROM table1
WHERE EXISTS (SELECT 1
             FROM table2
             WHERE table1.id = table2.id)
 AND /* OR */
     EXISTS (SELECT 1
             FROM table3
             WHERE table1.id = table3.id)

當您需要id同時存在於table1和中的 s 時table3,請使用AND.

當您需要id至少存在於這些表之一中的 s 時,請使用OR.

如果不查找引用表(您的範例中的表 2 和表 3),您無法確定哪些鍵被引用,哪些鍵未被引用。引用表的數據或元數據中沒有儲存此類資訊。不幸的是,您已經聲明了從一個表到另一個表的外鍵這一事實並不能使您能夠在不訪問引用表的情況下提取此類資訊。

您可以使用Akina 的建議作為查找正在引用的鍵的一種方法。您還可以使用IN謂詞:

SELECT id
FROM table1
WHERE id IN (SELECT id FROM table2)
  OR id IN (SELECT id FROM table3)
  OR ...  /* repeat as many times as there are referencing tables */

這是另一種方法,使用集合運算符INTERSECTUNION

(
 SELECT id FROM table1
 INTERSECT
 SELECT id FROM table2
)

UNION

(
 SELECT id FROM table1
 INTERSECT
 SELECT id FROM table3
)

UNION

... /* repeat as many times as there are referencing tables */

關於最後一個查詢的一個小註釋:INTERSECT優先級高於UNIONPostgreSQL,這意味著上面的查詢在沒有括號的情況下也可以正常工作。儘管如此,使用方括號可以讓您的意圖更清晰,這在查詢編寫中絕不是一件壞事。

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