无论是开发人员,或者数据库管理员,无论我们如何努力,如何小心,都难免会需要更改表子段的类型。 主要有以下原因:
- 字段长度不够用
- 字段类型和本地数据库的其它表相同业务含义的字段没有保持一致
- 字段类型和外部系统相同业务含义的字段没有保持一致
在DB2中如何修改字段类型:
基本语法: alter table <TABLE_NAME> alter column <COLUMN_NAME> set data type <NEW TYPE>
Examples:
alter table HR.EMPLOYEE alter column HOBBY set data type varchar(300);
注意: 修改后的新类型<NEW TYPE>相比修改前的数据类型,必须是castable(可转换,详细信息参考本文后面的官方文档,但是又一个重要的原则就是不能你让数据库为难,比如字段里有20个字节的数据,你非得转成10个字节那就不行,如果CHAR字段里含有‘aa',你非得转变成int,那也不行)的。一般来说,在修改字段类型之后都需要做REORG(数据重组)
reorg table HR.EMPLOYEE with distribution and indexes all
但是如下的改动不需要做reorg. (我比较懒,除非表特别大,一般做完这种表结构改动后都会做一遍reorg /runstats)
- 增加VARCHAR, VARGRAPHIC, or VARBINARY的长度
- 减少VARCHAR, VARGRAPHIC, or VARBINARY的长度,但是不需要删除这些字段最后的空格,并且在此字段上无索引。
在DB2中如何修改字段从空=>非空:
基本语法: alter table <TABLE_NAME> alter column <COLUMN_NAME> set <NOT NULL>
Examples:
alter table HR.EMPLOYEE alter column HOBBY set not null;
在DB2中如何修改字段从非空=>空:
基本语法: alter table <TABLE_NAME> alter column <COLUMN_NAME> drop not null
Examples:
alter table HR.EMPLOYEE alter column HOBBY drop not null;
详细ALTER TABLE 语法,请参考IBM DB2的Knowledge Center:
https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000888.html
详细哪些数据类型到哪些数据类型是Castable的参考:
https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0008478.html