有這么一張表:
create table emp5( id number(4), name nvarchar2(20), primary key(id) )
如果想讓它的name字段只能輸入固定值如a,b,可以這樣給name字段加上check:
alter table emp5 modify(name nvarchar2(20) default 'a' check(name ='a' or name ='b'));
此句完成后,測試一下:
SQL> insert into emp5(id,name) values(1,'a'); 已創建 1 行。 SQL> insert into emp5(id,name) values(2,'b'); 已創建 1 行。 SQL> commit; 提交完成。
從上面兩句看,a,b是可以插入name字段的。
SQL> insert into emp5(id,name) values(3,'c'); insert into emp5(id,name) values(3,'c') * 第 1 行出現錯誤: ORA-02290: 違反檢查約束條件 (LUNA.SYS_C007644) SQL> insert into emp5(id,name) values(4,'d'); insert into emp5(id,name) values(4,'d') * 第 1 行出現錯誤: ORA-02290: 違反檢查約束條件 (LUNA.SYS_C007644)
這里明顯c,d就插不進去了,上面還提示了約束名稱,待會我們還將看見它。
如果我們要增加c和d也能插入name字段該如何呢?用下面語句變更check條件是否可以呢?
alter table emp5 modify(name nvarchar2(20) default 'a' check(name ='a' or name ='b' or name ='c' or name ='d'));
讓我們看看執行完了后能否插入?
SQL> alter table emp5 modify(name nvarchar2(20) default 'a' check(name ='a' or name ='b' or name ='c' or name ='d')); 表已更改。 SQL> insert into emp5(id,name) values(3,'c'); insert into emp5(id,name) values(3,'c') * 第 1 行出現錯誤: ORA-02290: 違反檢查約束條件 (LUNA.SYS_C007644) SQL> insert into emp5(id,name) values(4,'d'); insert into emp5(id,name) values(4,'d') * 第 1 行出現錯誤: ORA-02290: 違反檢查約束條件 (LUNA.SYS_C007644)
看來還是不行,這個坑很容易讓人中招。我們又一次看到了惱人的SYS_C007644
這時使用 alter table emp5 drop constraint sys_c007644 這種語句刪掉SYS_C007644就好了,之后舊的約束會刪除,新的約束會生效。
如果你還想多學一點,請繼續往下看:
如果我們要看一張表上有多少約束,可以使用這樣的語句:
select constraint_name,constraint_type,search_condition from user_constraints where table_name='EMP5'
執行效果:
SQL> select constraint_name,constraint_type,search_condition from user_constraints where table_name='EMP5'; CONSTRAINT_NAME CONSTRAINT_TYPE SEARCH_CONDITION -------------------- -------------------- -------------------- SYS_C007644 C name ='a' or name =' b' SYS_C007645 C name ='a' or name =' b' or name ='c' or n ame ='d' SYS_C007643 P
明顯,有兩個Check約束都加在name字段上,我們刪掉那個范圍小的就好:
SQL> alter table emp5 drop constraint sys_c007644; 表已更改。
再看看插入情況:
SQL> insert into emp5(id,name) values(3,'c'); 已創建 1 行。 SQL> insert into emp5(id,name) values(4,'d'); 已創建 1 行。
終於成了!最終表中數據為:
SQL> select * from emp5; ID NAME ---------- ---------------------------------------- 1 a 2 b 3 c 4 d
END