Postgresql

Postgres:我可以將索引與 FK 約束相關聯嗎?

  • October 29, 2019

Postgres FK 約束和索引是獨立的。

最近,我正在尋找未使用的索引,並發現了通過以下方式消除約束執行所需的索引的技巧:

WHERE NOT EXISTS (SELECT 1 
                  FROM pg_constraint c 
                  WHERE c.conindid = pg_stat_user_indexes.indexrelid)

我們獨立於索引創建了 FK 約束。

是否有可能以某種方式pg_constraint.conindid將索引與 FK 約束相關聯,以便從 FK 指向索引?

就像是:

ALTER TABLE my ALTER CONSTRAINT my_your_fk USING INDEX my_your_fk_i;

更新我在 Postgres 文件中看到了一些相關的內容:

ALTER TABLE distributors DROP CONSTRAINT distributors_pkey,
ADD CONSTRAINT distributors_pkey PRIMARY KEY USING INDEX dist_id_temp_idx;

我不是 100% 確定你在問什麼。

您的查詢顯示了外鍵約束與目標索引的關聯。

源索引和外鍵約束之間沒有關聯。

您可以使用此查詢查找源中沒有索引的所有外鍵,這些外鍵支持對目標表進行快速更新和鍵修改:

SELECT conrelid::regclass, conname
FROM pg_constraint AS c
WHERE c.contype = 'f'
 AND NOT EXISTS (SELECT 1 FROM pg_index AS i
                 WHERE i.indrelid = c.conrelid
                   AND (i.indkey::smallint[])[0:cardinality(c.conkey)-1] @> c.conkey);

奇怪的條件將測試第一個索引列是否與外鍵定義中的列相同。

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