如果我更改索引表达式中函数的定义,是否需要重新索引索引?

时间:2017-02-06 21:10:41

标签: sql postgresql

假设我已经在涉及postgresql中的函数的表达式上创建了一个btree。

create table t (x int);

create function f(t) returns int
language sql immutable
as $function$
    select x + 1;
$function$

create index i on t (f(x));

假设我将f的定义更改为;

create or replace function f(t) returns int
language sql immutable
as $function$
    select x + 2; -- Notice the difference!
$function$

我是否必须手动reindex i或者postgresql在我更新定义时为我做这件事?如果我不reindex,我的索引会无效吗?

1 个答案:

答案 0 :(得分:2)

结果是postgresql可以让你在不抱怨的情况下更改函数定义,并且只会在更新这些行时更新btree的键。密钥将不一致,但postgresql仍然认为索引有效。

此外,如果其他人尝试这样的事情。进行此更改的(唯一?)一致方法是:

  1. 事务1:创建新功能
  2. 事务1:使用该功能创建新索引
  3. 事务2:删除旧索引
  4. 事务2:删除旧功能
  5. 使用reindex需要t上的访问权限锁定,因此只需构建新索引即可您可以保持在线阅读