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

  • 相关阅读:
    使用jetty部署配置solr服务
    solr 与 MySQL(二)
    学习solr(一)
    FormData 上传文件
    node.js cannot find module 'mysql'
    select2 ajax 无法选中
    jenkins持续集成文件冲突的问题
    Inno Setup 实现每次jenkins自动构建时版本号自动+1
    jenkins 配置slave节点(win10系统)
    Jenkins+Gradle实现android开发持续集成和打包
  • 原文地址:https://www.cnblogs.com/heyang78/p/15625922.html
Copyright © 2011-2022 走看看