今天遇到一個問題,想要刪掉一個表中的某列的唯一約束,google了一下,搜出來許許多多,找到能用的,記下來總結如下。
命令如下
select constname, tabname, colname, colseq from syscat.keycoluse where TABNAME='TableName'
ALTER TABLE DB2ADMIN.BM_SERVERS DROP UNIQUE <constname>;
第一行查找出列對應的constname,第二行呢就將它從表中刪除。
先記錄下相關的一些可能用到的命令及表【轉載】
目錄視圖 | 視圖列 | 描述 | 查詢實例 |
SYSCAT.CHECKS | 為每個表檢查約束包含一行記錄 | db2 select constname, tabname, text from syscat.checks | |
SYSCAT.COLCHECKS | 為表檢查約束所引用的每一列包含一行記錄 | db2 select constname, tabname, colname, usage from syscat.colchecks | |
SYSCAT.COLUMNS | NULLS | 指明一列是可為空(Y)還是不可為空(N) | db2 select tabname, colname, nulls from syscat.columns where tabschema = 'MELNYK' and nulls = 'N' |
SYSCAT.CONSTDEP | 為某些其他對象上的約束的每個依賴性包含一行記錄 | db2 select constname, tabname, btype, bname from syscat.constdep | |
SYSCAT.INDEXES | 為每個索引包含一行記錄 | db2 select tabname, uniquerule, made_unique, system_required from syscat.indexes where tabschema = 'MELNYK' | |
SYSCAT.KEYCOLUSE | 為惟一、主鍵或外鍵約束定義的鍵中所包含的每個列包含一行記錄 | db2 select constname, tabname, colname, colseq from syscat.keycoluse | |
SYSCAT.REFERENCES | 為每個參照約束包含一行記錄 | db2 select constname, tabname, refkeyname, reftabname, colcount, deleterule, updaterule from syscat.references | |
SYSCAT.TABCONST | 為每個惟一(U)、主鍵(P)、外鍵(F)或表檢查(K)約束包含一行記錄 | db2 select constname, tabname, type from syscat.tabconst | |
SYSCAT.TABLES | PARENTS | 該表的父表數目(該表在其中充當子表的參照約束數目) | db2 "select tabname, parents from syscat.tables where parents > 0" |
SYSCAT.TABLES | CHILDREN | 該表的子表數目(該表在其中充當父表的參照約束數目) | db2 "select tabname, children from syscat.tables where children > 0" |
SYSCAT.TABLES | SELFREFS | 該表的自引用參照約束數目(該表在其中既充當父表又充當子表的參照約束數目) | db2 "select tabname, selfrefs from syscat.tables where selfrefs > 0" |
SYSCAT.TABLES | KEYUNIQUE | 在該表上所定義的惟一約束(除了主鍵)的數目 | db2 "select tabname, keyunique from syscat.tables where keyunique > 0" |
SYSCAT.TABLES | CHECKCOUNT | 在該表上所定義的檢查約束的數目 | db2 "select tabname, checkcount from syscat.tables where checkcount > 0" |
更多請查看 http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0401melnyk/
DB2 官方文檔:http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.kc.doc/welcome.html?lang=zh
知其然,知其所以然,那么下面就要討論下這些都是神馬啊?當然也是從以上文檔中總結出來滴
DB2有五種約束:
-
NOT NULL 約束是這樣一種規則,它防止在表的一列或多列中輸入空值。
-
唯一約束(也稱為唯一鍵約束)是這樣一種規則,它禁止表的一列或多列中出現重復值。唯一鍵和主鍵是受支持的唯一約束。例如,可對供應商表中的供應商標識定義唯一約束以確保不會對兩個供應商指定同一供應商標識。
-
主鍵約束是與唯一約束具有相同屬性的一列或列的組合。可使用主鍵和外鍵約束來定義表之間的關系。
-
外鍵約束(也稱為引用約束或引用完整性約束)是關於一個或多個表中的一列或多列中的值的一種邏輯規則。例如,一組表共享關於公司的供應商的信息。供應商的名稱有時可能會更改。可定義一個引用約束,聲明表中的供應商的標識必須與供應商信息中的供應商標識相匹配。此約束會阻止可能導致丟失供應商信息的插入、更新或刪除操作。
-
(表)檢查約束(也稱為檢查約束)對添加至特定表的數據設置限制。例如,表檢查約束可確保每當在包含個人信息的表中添加或更新薪水數據時,職員的薪水級別至少為 $20000。
創建 Not null:
CREATE TABLE EMPLOYEES (. . .
EMERGENCY_PHONE CHAR(14) NOT NULL,
. . .
);
修改之:
db2 "alter table tabname ALTER colname drop not null"
db2 "alter table t01 ALTER colname set not null"
創建、刪除唯一約束:
db2 "alter table tabname add unique(colname)"
db2 "alter table tabname drop unique CONSTNAME "
創建主鍵約束:
db2 "alter table staff add primary key (id)"
創建外鍵約束:
db2 alter table project add foreign key (respemp) references employee on delete cascade
表檢查約束:
db2 alter table employee add constraint phoneno_length check (length(rtrim(phoneno)) = 4)