zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    my read map subway / metro / map / ditie / gaotie / traffic / jiaotong
    hd printer lexmark / dazifuyin / dayin / fuyin
    软件应用程序的打包和部署
    99款高质量免费(X)HTML/CSS模板
    PetShop4.0的安装、设置、调试与体验(草稿)
    山塞一个PetShop(Task000)——架构
    如何用C#开发的计算器小软件
    DIV+CSS布局参考站点
    影响计算机性能的设置
    ASP.NET知识点:母版页的路径问题
  • 原文地址:https://www.cnblogs.com/heyang78/p/15625922.html
Copyright © 2011-2022 走看看