Postgresql
如何獲得用作 FK 的 PK 數量?
如何獲得用作 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 */
這是另一種方法,使用集合運算符
INTERSECT
和UNION
:( 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
優先級高於UNION
PostgreSQL,這意味著上面的查詢在沒有括號的情況下也可以正常工作。儘管如此,使用方括號可以讓您的意圖更清晰,這在查詢編寫中絕不是一件壞事。