2

我在 9.7.0.2 版本中使用 DB2。

我有一个使用以下 DDL 创建的表:

  CREATE TABLE atable (
     id int PRIMARY KEY NOT NULL,
     int1 int NOT NULL,
     int2 int NOT NULL,
     smallint1 smallint NOT NULL,

     dec1 decimal(11,2) DEFAULT 0 NOT NULL,
     dec2 decimal(11,2) DEFAULT 0 NOT NULL,
     dec3 decimal(11,2) DEFAULT 0 NOT NULL,
     dec4 decimal(11,2) DEFAULT 0 NOT NULL,
     dec5 decimal(11,2) DEFAULT 0 NOT NULL,
     dec6 decimal(11,2) DEFAULT 0 NOT NULL,
     dec7 decimal (11,2) DEFAULT 0 NOT NULL,
     dec8 decimal(11,2) DEFAULT 0 NOT NULL
  );

  CREATE INDEX i_atable_int1 ON atable(int1);
  CREATE UNIQUE INDEX pk_atable ON atable(id);

我想扩大所有小数列的长度。所以我运行alter table如下语句:

    ALTER TABLE atable
        ALTER COLUMN dec1 SET DATA TYPE decimal(23, 4)
        ALTER COLUMN dec2 SET DATA TYPE decimal(23, 4)
        ALTER COLUMN dec3 SET DATA TYPE decimal(23, 4)
        ALTER COLUMN dec4 SET DATA TYPE decimal(23, 4)
        ALTER COLUMN dec5 SET DATA TYPE decimal(23, 4)
        ALTER COLUMN dec6 SET DATA TYPE decimal(23, 4)
        ALTER COLUMN dec7 SET DATA TYPE decimal(23, 4)
        ALTER COLUMN dec8 SET DATA TYPE decimal(23, 4);

什么导致:The row length of the table exceeded a limit of "4005" bytes. (Table space "USERSPACE1".). SQLCODE=-670, SQLSTATE=54010, DRIVER=3.59.81 SQL Code: -670, SQL State: 54010

当表在 16k 页大小的表空间中创建时,该语句不会失败,但请记住,手动计算的行长度与 4005 字节相差甚远。

当我将语句分成多个时,事情也变得奇怪alter table

    ALTER TABLE atable
        ALTER COLUMN dec1 SET DATA TYPE decimal(23, 4);
    ALTER TABLE atable
        ALTER COLUMN dec2 SET DATA TYPE decimal(23, 4);
    ALTER TABLE atable
        ALTER COLUMN dec3 SET DATA TYPE decimal(23, 4);
    ALTER TABLE atable   
        ALTER COLUMN dec4 SET DATA TYPE decimal(23, 4);
    ALTER TABLE atable
        ALTER COLUMN dec5 SET DATA TYPE decimal(23, 4);
    ALTER TABLE atable
        ALTER COLUMN dec6 SET DATA TYPE decimal(23, 4);
    ALTER TABLE atable
        ALTER COLUMN dec7 SET DATA TYPE decimal(23, 4);
    ALTER TABLE atable
        ALTER COLUMN dec8 SET DATA TYPE decimal(23, 4);

所有语句都运行并且列被放大。

这种令人惊讶的行为可能是什么原因?

4

0 回答 0