第十四章约束课堂笔记和练习

– 约束:not null、unique、primary key、foreign key、check

  • not null(非空约束)
    – 1.只能定义列级别的约束
    – 2.值不可以为空(不允许null 与 ”)

    --  定义没有约束名称的not null
    --  1.创建emp备份表,且约束雇员姓名与部门编号不能为空
        create table emp_copy (
               empno number(4),
               ename varchar2(10) not null,
               job   varchar2(9),
               mgr   number(4),
               hiredate date,
               sal   number(7,2),
               comm  number(7,2),
               deptno number(2) not null
        );
    
    
    --  定义有约束名称的not null
    --  1.创建emp备份表,且约束雇员姓名与部门编号不能为空
        create table emp_copy (
               empno number(4),
               ename varchar2(10) constraint emp_ename_null not null,
               job   varchar2(9),
               mgr   number(4),
               hiredate date,
               sal   number(7,2),
               comm  number(7,2),
               deptno number(2) constraint emp_deptno_null not null
        );
    --  测试约束     
    insert into emp_copy values(1,'张三','程序猿',9999,sysdate,5000,500,10); --ok
    insert into emp_copy(empno,ename) values(2,'李四');-- not ok 无法将null值存入
    insert into emp_copy(empno,ename,deptno) values(2,'李四',20); --ok
    insert into emp_copy(empno,ename,deptno) values(2,'李四',null);--not ok
    insert into emp_copy(empno,ename,deptno) values(2,'李四','');  --not ok
    insert into emp_copy(empno,ename,deptno) values(2,'李四',0); --ok
    insert into emp_copy(empno,ename,deptno) values(2,0,10);     --ok
    insert into emp_copy(empno,ename,deptno) values(2,'  ',10);  --ok
    insert into emp_copy(empno,ename,deptno) values(2,'',10);    --not ok
    
  • unique(唯一约束)
    – 1、可以定义列级别,也可以定义表级别约束
    – 2、值必须唯一,可以为null
    – 3、默认给当前约束列添加索引
    – 4、可以同时给一列或多列定义组合约束
    – 5、每一个表可以同时定义多个unique唯一约束

    --定义没有名字unique约束
    1.创建emp备份表,且约束雇员姓名唯一(列级别),雇员编号唯一(表级别)
    create table emp_copy(
          empno number(4),
          ename varchar2(10) unique,--列级别约束 ,系统命名SYS_C0010859
          job varchar2(9),
          mgr number(4),
          hiredate date,
          sal number(7,2),
          comm number(7,2),
          deptno number(2),
          unique(empno)--表级别约束,系统命名SYS_C0010860
    );
    
    --  定义有名字的unique约束
    --  1.创建emp备份表,且约束雇员姓名唯一(列级别),雇员编号唯一(表级别)
        create table emp_copy (
               empno number(4),
               ename varchar2(10) constraint emp_ename_unique unique,
               job   varchar2(9),
               mgr   number(4),
               hiredate date,
               sal   number(7,2),
               comm  number(7,2),
               deptno number(2),
               constraint emp_deptno_unique unique(deptno)
        );
    
        --  测试用例
        insert into emp_copy(empno,ename) values(3,null);--ok
        insert into emp_copy(empno,ename) values(3,null);
        --违反唯一约束scott.emp_ename_unique
        insert into emp_copy(empno,ename) values(4,'tom');--ok
    
    
    --  定义组合unique约束
    --  1.创建emp备份表,且约束雇员姓名与雇员编号组合唯一(表级别)
    create table emp_copy(
          empno number(4),
          ename varchar2(10),
          job varchar2(9),
          mgr number(4),
          hiredate date,
          sal number(7,2),
          comm number(7,2),
          deptno number(2),
          constraint emp_no_name_unique unique(empno,ename)--表级别约束
    );
    
  • primary key(主键约束)
    – 1、可以定义列级别,也可以定义表级别约束
    – 2、值必须唯一,可以为null
    – 3、默认给当前约束列添加索引
    – 4、可以同时给一列或多列定义组合约束
    – 5、每个表只能允许存在一个主键

    --  列级别定义
        create table emp_copy (
               empno number(4),
               ename varchar2(10) constraint emp_ename_pk primary key,
               job   varchar2(9),
               mgr   number(4),
               hiredate date,
               sal   number(7,2),
               comm  number(7,2),
               deptno number(2)
        );
    
    --  表级别定义
       create table emp_copy (
               empno number(4),
               ename varchar2(10),
               job   varchar2(9),
               mgr   number(4),
               hiredate date,
               sal   number(7,2),
               comm  number(7,2),
               deptno number(2),
               constraint emp_ename_pk primary key(empno,ename)
        ); 
    
  • foreign key(外键约束)
    – 1、可以定义列级别,也可以定义表级别约束
    – 2、取值范围必须为对应表的对应列中的值,可以为null
    – 3、每个表可以存在多个外键
    – 4、外键关联列只能是唯一键或主键列
    – 主键表主键值被外键表参照时,主键表记录不允许被删除

    --  列级别约束
        create table emp_copy (
               empno number(4),
               ename varchar2(10),
               job   varchar2(9),
               mgr   number(4),
               hiredate date,
               sal   number(7,2),
               comm  number(7,2),
               deptno number(2) constraint emp_ename_fk references dept(deptno)
        ); 
    
    
    --  表级别定义
        create table emp_copy (
               empno number(4),
               ename varchar2(10),
               job   varchar2(9),
               mgr   number(4),
               hiredate date,
               sal   number(7,2),
               comm  number(7,2),
               deptno number(2),
               constraint emp_ename_fk foreign key(deptno) references dept(deptno)
        );
    
    --  级联删除
        create table emp_copy (
               empno number(4),
               ename varchar2(10),
               job   varchar2(9),
               mgr   number(4),
               hiredate date,
               sal   number(7,2),
               comm  number(7,2),
               deptno number(2),
               constraint emp_ename_fk foreign key(deptno) 
                                       references dept(deptno) on delete set null
        );
    
  • check(检查约束) :
    – 1.能定义列级别,也能定义为表级别约束
    – 2.取值范围必须为约束条件约定的范围
    – 3.每一个表可以存在多个check约束
    – > >= = < <=运算符

    create table emp_copy(
          empno number(4),
          ename varchar2(10),
          job varchar2(9),
          mgr number(4),
          hiredate date,
          sal number(7,2), --constraint emp_sal_check check(sal >=1600),--列级别约束
          comm number(7,2),
          deptno number(2),
          constraint emp_sal_check check(sal >=1600)
    );
    insert into emp_copy(empno,ename,sal) values(1,'tom',1600);--ok
    insert into emp_copy(empno,ename,sal) values(1,'tom',1599);
    --not ok 违反约束条件scott.emp_sal_check
    
    --in()运算符
    create table emp_copy(
          empno number(4),
          ename varchar2(10),
          job varchar2(9),
          mgr number(4),
          hiredate date,
          sal number(7,2),
          comm number(7,2),
          deptno number(2),
          constraint emp_job_check check(job in('程序媛','程序猿','挨踢人'))
    );
    insert into emp_copy(empno,ename,job) values(1,'tom',null);--ok
    insert into emp_copy(empno,ename,job) values(1,'tom','SALES');
    --not ok 违反检查约束条件scott.emp_job_check
    insert into emp_copy(empno,ename,job) values(1,'tom','程序猿');--ok
    
    --between..and..运算符
    create table emp_copy(
          empno number(4),
          ename varchar2(10),
          job varchar2(9),
          mgr number(4),
          hiredate date,
          sal number(7,2),
          comm number(7,2),
          deptno number(2),
          constraint emp_sal_check check(sal between 1600 and 99999)
    );
    insert into emp_copy(empno,ename,sal) values(1,'tom',null);--ok
    insert into emp_copy(empno,ename,sal) values(1,'tom',99999);--ok
    insert into emp_copy(empno,ename,sal) values(1,'tom',1500);--not ok
    
    --综合定义emp表
    create table emp_copy(
          empno number(4) constraint emp_empno_pk primary key,  --primary key主键约束
          ename varchar2(10) constraint emp_ename_unique unique,    --unique唯一约束
          job   varchar2(9) constraint emp_job_nn not null,      --not null 非空约束
          mgr   number(4),
          hiredate date,
          sal   number(7,2) constraint emp_sal_check check(sal>0), --check检查性约束
          comm  number(7,2),
          deptno number(2) constraint emp_deptno_fk references dept(deptno)  
          --foreign key外键约束
    );  
    
  • 追加约束

        create table emp_copy(
          empno number(4),
          ename varchar2(10),
          job varchar2(9),
          mgr number(4),
          hiredate date,
          sal number(7,2),
          comm number(7,2),
          deptno number(2)
          );
    
        alter table emp_copy add constraint emp_empno_pk primary key(empno);
        --追加到表emp_copy,empno主键约束
    
        alter table emp_copy add constraint emp_empno_unique unique(ename);
        --追加到表emp_copy,ename唯一约束
    
        alter table emp_copy add constraint emp_empno_ck check(sal>0);--
    
        --not null非空约束
        alter table emp_copy modify(job constraint emp_job_nn not null);
    
  • 删除约束

        alter table emp_copy drop primary key;  --删主键
        alter table emp_copy drop constraint emp_empno_pk; --删主键
    
        alter table emp_copy drop unique(ename);--删唯一键
        alter table emp_copy drop constraint emp_ename_unique;--删唯一键
    
        alter table emp_copy drop constraint emp_sal_check;--删检查性约束
        alter table emp_copy drop constraint emp_deptno_fk;--删除外键
    
        --alter table emp_copy modify(job);--not ok设置为可以为null
        alter table emp_copy drop constraint emp_job_nn; --允许为null
    
  • 禁用约束

        alter table emp_copy disable constraint emp_empno_pk;--禁用主键
        alter table emp_copy disable constraint emp_ename_unique;--禁用唯一键
        alter table emp_copy disable constraint emp_sal_check;--禁用检查性约束
        alter table emp_copy disable constraint emp_deptno_fk;--禁用外键
        alter table emp_copy disable constraint emp_job_nn;--禁用非空约束
    
  • 启用约束

        alter table emp_copy enable constraint emp_empno_pk;--启用主键
        alter table emp_copy enable constraint emp_ename_unique;--启用唯一键
        alter table emp_copy enable constraint emp_sal_check;--启用检查性约束
        alter table emp_copy enable constraint emp_deptno_fk;--启用外键
        alter table emp_copy enable constraint emp_job_nn;--启用非空约束
    
  • 查看约束的数据字典表

    select * from user_constraints;--查看当前用户所有的约束
    select * from user_cons_columns where constraint_name ='EMP_DEPTNO_FK';
    -- 查看约束及对应的列名
    

猜你喜欢

转载自blog.csdn.net/bb_code_exchange/article/details/81364808
今日推荐