db2数据库支持直接使用ddl修改原表列属性,但是在修改之前需要确认要修改的列是否存在唯一性约束,否则你是无法修改属性的。
注:该 *** 作会导致表处于pending状态,在 *** 作之前需要确认该表是否24小时表,是否为大表(因为需要reorg重置表状态,数据量太大将导致业务中断时间变长),谨慎 *** 作~
以下是具体 *** 作步骤,敬请参考:
1、首先检查需要修改的列是否含有唯一性检查约束(注:主键不可设置为null)
1)使用db2系统表查询将要修改的表是否含有唯一约束
#db2 "select CONSTNAME, type from SYSCAT.TABCONST where TABNAME='T01'"
#主要看type,一般type的值有P(主键约束)、U(唯一性约束)、K(列值检查)、F(外键)
#如果返回的type值中有没有U类型的行则可以直接将原列设置为null然后reorg即可,反之需要继续第二步
2)使用db2look工具确认
#db2look -d dbname -e -t tabname
#查看将要修改的表的ddl语句,检查是否有unique子句,如果有这证明有唯一性约束列存在
2、如果有唯一性约束且恰好定义在需要修改的列上,我们需要先将该列的唯一性约束删除,如果没有则跳过该步
#db2 "alter table tabname drop unique CONSTNAME "
#回退步骤:db2 "alter table tabname add unique(colname)"
3、修改列的属性为null
db2 "alter table tabname ALTER colname drop not null"
#回退步骤:db2 "alter table t01 ALTER colname set not null"
4、对该表进行重组
因为修改列的属性后,该表处于reorg pending状态所以我们必须进行reorg才能使该表恢复到正常状态(这一步很重要)
db2 "reorg table tabname use tempsys"
db2 "runstats on table tabname with distribution and detailed indexes all"
5、验证
db2 load query table tabname
如果返回表状态为normal则此次 *** 作完成。
--删除主键
ALTER TABLE EXP.OLTP_TRANSFERS DROP PRIMARY KEY
COMMIT
--新增主键
ALTER TABLE EXP.OLTP_TRANSFERS ADD CONSTRAINT OLTP_TRANSFERS_PK PRIMARY KEY(COLUMN_NAME)
COMMIT
--添加索引
CREATE /*UNIQUE唯一*/ INDEX EXP.OLTP_TRANSFERS_IDX_1
ON EXP.OLTP_TRANSFERS ( COLUMN_NAME ASC )
ALLOW REVERSE SCANS
COMPRESS NO INCLUDE NULL KEYS
COMMIT
--删除索引
DROP INDEX EXP.OLTP_TRANSFERS_IDX_1
COMMIT
--添加字段
ALTER TABLE EXP.OLTP_TRANSFERS ADD COLUMN COLUMN_NAME VARCHAR(10)
COMMIT
--设置非空,需要重整表
ALTER TABLE EXP.OLTP_TRANSFERS ALTER COLUMN COLUMN_NAME SET NOT NULL
COMMIT
--删除字段,需要重整表
ALTER TABLE EXP.OLTP_TRANSFERS DROP COLUMN COLUMN_NAME CASCADE
COMMIT
--重整表
REORG TABLE EXP.OLTP_TRANSFERS
COMMIT
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)