我处于一个特殊的情况:
我有多个索引以及使用函数的表达式。我想将它们切换到不同的函数,在那里我可以保证函数的行为相同(因此索引值不会无效)。理想情况下,我不想删除现有索引并重新索引它们,因为这需要更多的开发开销。
我可以在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 稍后碰巧被重新用于不同的功能,您还可能会遇到其他有趣的数据损坏方式。