Postgresql
使用表達式更改索引的定義而不刪除/重新創建索引
我處於一個特殊的情況:
我有多個索引以及使用函式的表達式。我想將它們切換到不同的函式,在那裡我可以保證函式的行為相同(因此索引值不會無效)。理想情況下,我不想刪除現有索引並重新索引它們,因為這需要更多的開發成本。
我可以在
pg_index
表格中看到,有一個indexprs
列,其中包含索引的“內部”定義(該pg_indexes
表格是這個的漂亮列印版本)。具體來說,我認為我確定了相關索引的格式類似於({FUNCEXPR :funcid 870 :funcresulttype 25 :funcretset false
……將其回溯
funcid 870
到 中information_schema.routines
,我能夠將其與specific_name
(包含此 funcid)相關聯,並且能夠確定它確實是我想要更改的特定功能。理論上是否可以用新的funcid替換這個funcid,然后索引將引用新的函式?我該怎麼做,因為這個列是 pg_node_tree 類型的?如果沒有,有沒有辦法以一種非hacky的方式實現我的目標?
附錄:除非有一種被證明是安全的方法,否則我可能仍然會以“乾淨”的方式來做這件事,但這激起了我的興趣,足以提出一個問題。
如果你做得對,那會奏效,但我也不會那樣做。
但這還不夠:PostgreSQL 還通過 中的條目跟踪索引和函式之間的依賴關係
pg_depend
,因此您還必須修改相應的條目。否則,當您嘗試刪除索引時,您會收到有趣的錯誤消息。如果oid
870 稍後碰巧被重新用於不同的功能,您還可能會遇到其他有趣的數據損壞方式。