变更作为索引的一部分的列

如果变更的列是索引的一部分,那么表仍会定点变更,但此种情况下数据库服务器会默示地重新建立一个或多个索引。如果不需要重建索引,应在执行更改操作之前将其删除或禁用。 执行这些步骤可以提高性能。

但是,如果修改的列是主键或外键,而且您想要保持这种约束,那么您必须再次在 ALTER TABLE 语句中指定这些关键字,而且数据库服务器将重建索引。

例如:假设您使用以下 SQL 语句创建表并更改父表:
CREATE TABLE parent 
   (si SMALLINT PRIMARY KEY CONSTRAINT pkey);
CREATE TABLE child
   (si SMALLINT REFERENCES parent ON DELETE CASCADE
   CONSTRAINT ckey);
INSERT INTO parent (si) VALUES (1); 
INSERT INTO parent (si) VALUES (2); 
INSERT INTO child (si) VALUES (1); 
INSERT INTO child (si) VALUES (2); 
ALTER TABLE parent
   MODIFY (si INT PRIMARY KEY CONSTRAINT pkey);
该 ALTER TABLE 示例将 SMALLINT 列转换为 INT 列。由于 ALTER TABLE 语句指定了 PRIMARY KEY 关键字和 pkey 约束,因此数据库服务器将保留主键。在 MODIFY 子句中指定 PRIMARY KEY 约束时,数据库服务器还会在相同的主键列上静默创建 NOT NULL 约束。然而,数据库服务器会删除该主键的任何引用约束。因此,您还必须为子表指定以下 ALTER TABLE 语句:
ALTER TABLE child 
      MODIFY       (si int references parent on delete cascade
                  constraint ckey);
即使对主键或外键列的 ALTER TABLE 操作重建了索引,数据库服务器仍将利用定点变更算法。定点变更算法在性能方面可以带来以下好处:
警告: 如果变更作为视图的一部分的表,必须重建索引以获得表的最新定义。