PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

ALTER INDEX

ALTER INDEX — 更改一个索引的定义

Synopsis

ALTER INDEX [ IF EXISTS ] name RENAME TO new_name
ALTER INDEX [ IF EXISTS ] name SET TABLESPACE tablespace_name
ALTER INDEX name ATTACH PARTITION index_name
ALTER INDEX name [ NO ] DEPENDS ON EXTENSION extension_name
ALTER INDEX [ IF EXISTS ] name SET ( storage_parameter [= value] [, ... ] )
ALTER INDEX [ IF EXISTS ] name RESET ( storage_parameter [, ... ] )
ALTER INDEX [ IF EXISTS ] name ALTER [ COLUMN ] column_number
    SET STATISTICS integer
ALTER INDEX ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]
    SET TABLESPACE new_tablespace [ NOWAIT ]

描述

ALTER INDEX 更改一个现有索引的定义。下面描述了若干子形式。注意每一种子形式所要求的锁级别可能不同。除非明确说明,否则会持有 ACCESS EXCLUSIVE 锁。当列出多个子命令时,所持有的锁将是所有子命令中要求最严格的那一种。

RENAME

RENAME 形式更改索引的名称。如果索引与一个表约束相关联(UNIQUE、PRIMARY KEY 或者 EXCLUDE),那么该约束也会被重命名。这对存储的数据没有影响。

重命名一个索引会获取一个 SHARE UPDATE EXCLUSIVE 锁。

SET TABLESPACE

这种形式把索引的表空间更改为指定的表空间,并把与该索引关联的数据文件移动到新表空间。要更改一个索引的表空间,你必须拥有该索引并且在新表空间上拥有 CREATE 特权。通过使用 ALL IN TABLESPACE 形式,可以移动当前数据库中位于某个表空间内的所有索引,这种形式会先锁定所有要移动的索引,然后逐一移动它们。这种形式还支持 OWNED BY,它只会移动由指定角色拥有的索引。如果指定了 NOWAIT 选项,那么当命令无法立即获取所需的全部锁时就会失败。注意系统目录不会被此命令移动;如果需要,可以改用 ALTER DATABASE 或显式的 ALTER INDEX 调用。另请参见 CREATE TABLESPACE。

ATTACH PARTITION index_name

使被命名的索引(可以用模式限定)成为被更改索引的附加索引。被命名的索引必须位于包含被更改索引的表的一个分区上,并且具有等价的定义。一个被附加的索引不能被单独删除,并且如果其父索引被删除,它会被自动删除。

如果被命名的索引已经附加到被更改的索引上,并且父索引当前无效,则该命令将尝试验证父索引。

DEPENDS ON EXTENSION extension_name
NO DEPENDS ON EXTENSION extension_name

这种形式把该索引标记为依赖于该扩展;如果指定了 NO,则标记为不再依赖于该扩展。被标记为依赖于某个扩展的索引在该扩展被删除时会被自动删除。

SET ( storage_parameter [= value] [, ... ] )

这种形式更改该索引的一个或多个索引方法相关的存储参数。可用参数的详情请参见 CREATE INDEX。注意索引的内容不会立即被此命令修改;取决于参数的不同,你可能需要用 REINDEX 重建索引才能获得期望的效果。

RESET ( storage_parameter [, ... ] )

这种形式把一个或多个索引方法相关的存储参数重置为它们的默认值。与 SET 一样,可能需要 REINDEX 才能完全更新索引。

ALTER [ COLUMN ] column_number SET STATISTICS integer

这种形式为后续的 ANALYZE 操作设置针对每个列收集统计信息的目标,但它只能用于被定义为表达式的索引列。由于表达式没有唯一的名称,我们使用索引列的序号来引用它们。该目标可以设置为 0 到 10000 范围内的值;或者,把它设置为 -1 可以恢复为使用系统默认的统计信息目标(default_statistics_target)。有关 PostgreSQL 查询规划器如何使用统计信息的更多信息,请参考 Section 14.2。

参数

IF EXISTS

如果索引不存在则不抛出错误。在这种情况下会发出一个提示。

column_number

序号指的是索引列的顺序(从左到右)位置。

name

要更改的现有索引的名称(可以用模式限定)。

new_name

索引的新名称。

tablespace_name

该索引将被移动到的表空间。

extension_name

该索引将要依赖的扩展的名称。

storage_parameter

一个索引方法相关的存储参数的名称。

value

一个索引方法相关的存储参数的新值。取决于参数的不同,这可能是一个数字或一个词。

注记

使用 ALTER TABLE 也可以进行这些操作。ALTER INDEX 实际上只是适用于索引的 ALTER TABLE 形式的一个别名。

以前有一个 ALTER INDEX OWNER 变体,但现在它会被忽略(并发出警告)。索引的拥有者不能与其表的拥有者不同。更改表的拥有者会自动同时更改索引。

不允许更改系统目录索引的任何部分。

示例

重命名一个现有的索引:

ALTER INDEX distributors RENAME TO suppliers;

把一个索引移动到不同的表空间:

ALTER INDEX distributors SET TABLESPACE fasttablespace;

更改一个索引的填充因子(假定索引方法支持它):

ALTER INDEX distributors SET (fillfactor = 75);
REINDEX INDEX distributors;

为一个表达式索引设置收集统计信息的目标:

CREATE INDEX coord_idx ON measured (x, y, (z + t));
ALTER INDEX coord_idx ALTER COLUMN 3 SET STATISTICS 1000;

兼容性

ALTER INDEX 是 PostgreSQL 的扩展。

另请参阅

CREATE INDEX, REINDEX