单个alter table语句中的多个alter column语句导致'row length exceeded limit'

时间:2013-05-07 10:19:36

标签: db2 ddl alter-table

我在版本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);

运行所有语句并放大列。

这种惊人行为的原因是什么?

0 个答案:

没有答案