我在版本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);
运行所有语句并放大列。
这种惊人行为的原因是什么?