我在 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);
所有语句都运行并且列被放大。
这种令人惊讶的行为可能是什么原因?