今天把自己遇到的一個小問題跟大家分享一下如何修改db2數據庫表中列的屬性--將列的非空屬性改為允許空的屬性,修改數據表的某一列屬性其實很簡單但是里面有需要細節需要dba注意,畢竟數據的安全才是最重要的啊!
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則此次操作完成。