zoukankan      html  css  js  c++  java
  • day05_oracle各种约束示例

    约束的概念:
    约束是在表中定义的用于维护数据库完整性的一些规则。通过为表中的字段定义约束,可以防止将错误的数据插入到表中。


    注意:
    1.如果某个约束只作用于单独的字段,既可以在字段级定义约束,也可以在表级定义约束;但如果某个约束将作用于多个字段,必须在表级定义约束。
    2.oracle中的约束通过名称来进行识别。在定义约束时可以通过constraint关键字为约束命名。
    如果用户没有为约束指定名称,oracle将自动为约束建立默认的名称。




    一、
    主键约束(primary key):
    主键约束的特点:
     定义为主键约束的字段中不能包含任何重复值,并且不能包含null值。
     同1个表中只能定义1个主键约束。
     可以为一个字段定义主键约束,也可以为多个字段的组合定义主键约束。
     oracle会自动为具有主键约束的字段建立1个唯一索引和1个非空约束。
    例如:

     create table person
     (
           p_id int primary key,        --定义该字段为主键约束【字段级约束】
           p_name varchar2(20),
           p_age int
     );
     
     insert into person(p_id) values(1);
      insert into person(p_id) values(2);
       insert into person(p_id) values(null);
       
    create table person2
    (
           p_id int constraint pk_person2 primary key,    --定义该字段为主键约束,并指定约束名字【字段级约束】
           p_name varchar2(20),
           p_age int
    );

    create table person3
    (
           p_id int,
           p_name varchar2(20),
           p_age int,
           constraint pk3_person3 primary key (p_id,p_name)--定义复合主键,并指定名字【表级约束】
    );

       insert into person3(p_id,p_name) values(1,'1');
          insert into person3(p_id,p_name) values(1,'2');
             insert into person3(p_id,p_name) values(2,'1');



    二、
    非空约束(not null):
    非空约束的特点:
     定义了非空约束的字段中不能包含null值。
     只能在字段级定义非空约束。
     在同一个表中可以定义多个非空约束。
    例如:

    create table person4
    (
           p_id int,
           p_name varchar2(20) not null, --定义该列的非空约束
           p_age int 
     );

    insert into person4 values(1,null,1);


    create table person5
    (
           p_id int,
           p_name varchar2(20) not null, --定义该列的非空约束
           p_age int  not null
     );

    insert into person4 values(1,null,null);

    三、
    唯一约束(unique):
    唯一约束的特点:
     定义了唯一约束的字段中不能包含重复值。
     可以为1个字段定义唯一约束,也可以为多个字段的组合定义唯一约束。因此,唯一约束既可以定义在字段级,也可以定义在表级。
     oracle会自动为具有唯一约束的字段建立1个唯一索引。
     对同一字段可以同时定义非空和唯一约束。
     如果在1个字段上仅定义了唯一约束,而没有定义非空约束,则该字段可以包含多个null值。
    例如:
    create table person1
    (
           p_id int,
           p_name varchar2(20) unique,--定义该列的唯一约束
           p_age int
    );

    create table person22
    (
           p_id int,
           p_name varchar2(20) constraint gulaijing unique not null, --同时定义唯一和非空约束
           p_age int
    );

    create table person33
    (
           p_id int,
           p_name varchar2(20),
           p_age int,
           constraint p_un3 unique(p_name) --指定约束名字
    );





    四、
    外键约束(foreign key)
     外键约束的特点:
      定义为外键约束的字段中只能包含相应的其他表中引用字段的值或null值。
      可以为1个字段定义外键约束,也可以为多个字段的组合定义外键约束。
      定义了外键约束的字段和相应的引用字段可以存在于同1个表中,称为自引用。
      对同1个字段可以同时定义外键和非空约束。
      主表中的被引用列,必须有主键约束或唯一约束。
    例如:

    create table works(
    w_id int ,
    w_name varchar2(10)
    );

    create table works(
    w_id int primary key,
    w_name varchar2(10)
    );

     create table person
     (
           p_id int,
           p_name varchar2(20),
           p_age int,
           w_id int,
           constraint p_fk foreign key (w_id) references works(w_id)            --外键约束
      );
      
    在定义外键约束时,还可以通过on关键字来指定引用行为的类型。当主表中的一条记录被删除时,需要通过引用行为来确定如何处理子表中的外键列的值。
    delete cascade : 指删除父表记录时删除子表中所有的相关记录
    delete set null :指删除父表记录时 将所有相关记录的外部码字段值设置为NULL
    delete no action: 指删除父表记录时 不做任何操作【默认情况】



    create table DEPT2
    (
      DEPTNO NUMBER(2) not null,
      DNAME  VARCHAR2(14)
    );

    alter table DEPT2 add constraint PK_DEPT2 primary key (DEPTNO);
      
    insert into DEPT2 (DEPTNO, DNAME) values (10, '销售部');
    insert into DEPT2 (DEPTNO, DNAME) values (20, '运维部');
    insert into DEPT2 (DEPTNO, DNAME) values (30, '开发部');
    commit;
      
      delete dept2 where deptno=10;
      

    create table EMP2
    (
      EMPNO    NUMBER(4) not null,
      ENAME    VARCHAR2(10),
      DEPTNO   NUMBER(2)
    );

    (1)
    alter table EMP2 add constraint FK_DEPTNO2 foreign key (DEPTNO) references DEPT2 (DEPTNO);
    (2)
    alter table EMP2 add constraint FK_DEPTNO2 foreign key (DEPTNO) references DEPT2 (DEPTNO) on delete cascade;
    (3)
    alter table EMP2 add constraint FK_DEPTNO2 foreign key (DEPTNO) references DEPT2 (DEPTNO) on delete set null;

    insert into EMP2 (EMPNO, ENAME,DEPTNO) values (7369, 'SMITH',10);
    insert into EMP2 (EMPNO, ENAME,DEPTNO) values (7499, 'ALLEN',20);
    insert into EMP2 (EMPNO, ENAME,DEPTNO) values (7521, 'WARD',30);
    insert into EMP2 (EMPNO, ENAME,DEPTNO) values (7566, 'JONES',40);
    insert into EMP2 (EMPNO, ENAME,DEPTNO) values (7654, 'MARTIN',null);
    commit;





    alter table sys.EMP2  drop constraint FK_DEPTNO2;


    检查约束(check)
     检查约束的特点:
      在检查约束的表达式中必须引用到表中的一个或多个字段,并且表达式的计算结果必须是一个布尔值。
      在表达式中不能包含子查询。
      在表达式中不能包含sysdate,uid,user,userenv等sql函数,也不能包含rowid,rownum等伪列。
      检查约束可以在字段级和表级定义。
      对同一个字段可以定义多个检查约束,而且对同一个字段可以同时定义检查约束和非空约束。
    例如:
      create table person66
    (
           p_id int,
           p_name varchar2(20),
           p_age int check(p_age > 20)  
    );

    insert into person66 values(1,'1',11);
    insert into person66 values(1,'1',111);
    commit;


      create table person222
    (
           p_id int,
           p_name varchar2(20),
           p_age int constraint check_person_age check(p_age > 20) 
    );

    insert into person222 values(1,'1',11); 

     
      create table person333
    (
           p_id int,
           p_name varchar2(20),
           p_age int,
        constraint p_check3 check(p_age > 20) 
    ); 

     insert into person333 values(1,'1',11);
     
     
     



    -----------------------------额外补充--------------------------------

    添加主键约束
     alter table table_name add primary key(column_name);
    alter table table_name add constraint t_pk primary key(column_name);

    添加非空约束
    alter table person modify p_name not null;
    alter table person modify p_name constraint t_notnull not null;


    重命名约束
    alter table 表名 rename constraint 原约束名 to 新约束名

    alter table person2 rename hongbanzhang;

    删除约束
     alter table 表名 drop constraint 约束名;
     alter table 表名 drop constraint 约束名 cascade; 删除主键时级联删除子表的外键约束
     
     
    主键约束还可以如下删除:
    alter table person drop primary key;
    alter table person drop primary key cascade;
    注:删除约束时,默认将同时删除约束所对应的索引,如果要保留索引,用KEEP INDEX关键字
    SQL> alter table employees drop primary key keep index
    约束失效
     alter table 表名  disable constraint 约束名
     alter table 表名  disable constraint 约束名 cascade; --失效主键时级联删除子表的外键约束
     
     
    约束生效
     alter table 表名 enable constraint 约束名
    novalidate: --不验证老数据
    validate:--验证老数据

    控制现有数据是否应用约束,例如
    alter table t2 enable novalidate constraint SYS_C007211; -- 约束生效,不验证已有数据是否符合约束条件

    alter table t2 enable validate constraint SYS_C007211;  -- 约束生效,同时验证已有数据是否符合约束条件

    alter table t2 disable validate constraint SYS_C007211;   
    --约束失效,同时验证已有数据是否符合约束条件,之后不能对该表进行dml操作 ,否则会报ORA-25128错误
     
    alter table t2 disable novalidate constraint SYS_C007211;
    -- 约束失效,不验证已有数据是否符合约束条件(默认)
     
    注:约束生效(enable)后的操作都受约束的限制。





  • 相关阅读:
    SourceTree
    记录:解决标签在选中状态下,鼠标进入(hover)后变色的问题
    在angular中超过字数后以...展示
    小程序下拉刷新步骤——完成
    eclipse配置文件乱码
    jQuery的deferred对象
    营销策划书(2007)
    前端IT攻城狮--网址搜藏(-- 欢迎留言补充 --)
    prop和attr的区别
    HTML速写
  • 原文地址:https://www.cnblogs.com/xiaoxiao5ya/p/3a4eedd2abc2c6a5f88575055b63307c.html
Copyright © 2011-2022 走看看