【Oracle】Check型約束的創建、查看和刪除


有這么一張表:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM