zoukankan      html  css  js  c++  java
  • Oracle约束管理

    --约束(检查、校验)
    --创建约束的三种方式:1.定义时加在字段后,2.定义表时写在语句最后,3.声明表后再追加
    --五种约束:非空约束、唯一约束、检查约束、主键、外键
    --1.非空约束:被非空约束修饰的字段不能为空not null(可简写为nn),列级(只针对这一列生效)
    --方式一:定义时加在字段后
    create table EMPP
    (
      empno    NUMBER(4) not null,
      ename    VARCHAR2(10),
      job      VARCHAR2(9),
      mgr      NUMBER(4),
      hiredate DATE,
      sal      NUMBER(7,2),
      comm     NUMBER(7,2),
      deptno   NUMBER(2)
    )
    --错误,empno不允许为空
    insert into empp(ename) values ('chen');
    
    --方式二:定义表时写在语句最后
    --非空约束为列级约束,方式2只添加表级约束
    
    --方式三:声明表后再追加
    --非空约束为列级约束,方式3只添加表级约束
    alter table empp add constraint nn_empp_ename not null;
    
    --2.唯一约束,表中该列数据不允许重复(本次要求ename唯一)
    --方式一:定义时加在字段后
    drop table empp PURGE;
    create table EMPP
    (
      empno    NUMBER(4) not null,
      ename    VARCHAR2(10) unique,
      job      VARCHAR2(9),
      mgr      NUMBER(4),
      hiredate DATE,
      sal      NUMBER(7,2),
      comm     NUMBER(7,2),
      deptno   NUMBER(2)
    )
    insert into empp(empno,ename) values (1,'chen');
    --错误,违反唯一约束条件
    insert into empp(empno,ename) values (1,'chen');
    
    --方式二:定义表时写在语句最后(empno和ename联合起来是唯一的)
    create table EMPP
    (
      empno    NUMBER(4) not null,
      ename    VARCHAR2(10),
      job      VARCHAR2(9),
      mgr      NUMBER(4),
      hiredate DATE,
      sal      NUMBER(7,2),
      comm     NUMBER(7,2),
      deptno   NUMBER(2),
      constraint uq_empp_ename unique(empno,ename)
    );
    insert into empp(empno,ename) values (1,'chen');
    insert into empp(empno,ename) values (2,'chen');
    
    --方式三:声明表后再追加(empno和ename联合起来是唯一的)
    alter table empp add constraint uq_empp_ename unique(empno,ename);
    
    --3.检查约束:指定列的值必须满足要求的条件(假设job只能取员工或经理,sal工资不能小于1000)
    --注:如果检查约束要引用其他列,则不能使用列级约束,必须使用表级约束(方式2或3)
    --方式一:定义时加在字段后
    create table EMPP
    (
      empno    NUMBER(4) not null,
      ename    VARCHAR2(10),
      job      VARCHAR2(9) check (job in ('员工','经理')) ,
      mgr      NUMBER(4),
      hiredate DATE,
      sal      NUMBER(7,2) check(sal>1000),
      comm     NUMBER(7,2),
      deptno   NUMBER(2)
    );
    --错误,sal不符合大于1000的条件
    insert into empp (empno,ename,job,sal) values (1,'CHEN','经理',900);
    
    --方式二:定义表时写在语句最后(工资+奖金不能小于1000)
    create table EMPP
    (
      empno    NUMBER(4) not null,
      ename    VARCHAR2(10),
      job      VARCHAR2(9) ,
      mgr      NUMBER(4),
      hiredate DATE,
      sal      NUMBER(7,2) check(sal>1000),
      comm     NUMBER(7,2),
      deptno   NUMBER(2),
      constraint ck_empp_job_sal check (sal+comm>1000);
    );
    --方式三:声明表后再追加(工资+奖金不能小于1000)
    alter table empp add constraint ck_empp_salandcomm check (sal+comm>1000);
    
    --4.主键约束:指定表的主键,唯一标识(主键约束:非空且唯一)
    --方式一:定义时加在字段后
    create table EMPP
    (
      empno    NUMBER(4) primary key,
      ename    VARCHAR2(10),
      job      VARCHAR2(9) ,
      mgr      NUMBER(4),
      hiredate DATE,
      sal      NUMBER(7,2),
      comm     NUMBER(7,2),
      deptno   NUMBER(2)
    );
    --方式二:定义表时写在语句最后
    create table EMPP
    (
      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 pk_empp_empnoandename primary key(empno,ename); 
    );
    
    --方式三:声明表后再追加
    alter table empp add constraint pk_empp_empnoandename primary key(empno,ename);
    
    --5.外键约束:引用另一个表的一列
    --方式一:定义时加在字段后,无法添加外键约束
    
    --方式2添加外键约束
    --注:外键关联的字段必须为另一张表的唯一主键(不能是联合主键的其中一个)
    create table EMPP
    (
      empno    NUMBER(4),
      ename    VARCHAR2(10),
      deptno   NUMBER(4),
      constraint fk_empp_deptt_deptno foreign key(deptno) references deptt(deptno)
    );
    create table DEPTT
    (
      deptno    NUMBER(4) primary key,
      dname     VARCHAR2(10)
    );
    --方式3添加外键约束
    alter table empp add constraint fk_empp_deptt_deptno foreign key (deptno) references deptt(deptno) on delete cascade;
    
    --新增这个员工的部门编号,在部门表中没有这个部门
    --删除部门时,如果部门下有员工也不能删除这个部门,要先删净部门下员工(如果在创建序列规定了删除策略也可按策略删除)
    insert into empp (empno,ename,deptno) values (12,'张三1',10);
    insert into deptt (deptno,dname) values (10,'部门1');
    
    delete from empp where deptno=10;
    delete from deptt where deptno=10;
  • 相关阅读:
    C++实现邮件群发的方法
    HTML5 Canvas彩色小球碰撞运动特效
    ListView灵活的用法
    Win10计算器在哪里?三种可以打开Win10计算器的方法图文介绍
    设置Textview最大长度,超出显示省略号
    jQuery页面顶部下拉广告
    C#截屏
    细数人们对安卓的误解
    javaScript系列:js中获取时间new Date()详细介绍
    C# 发送Http请求
  • 原文地址:https://www.cnblogs.com/qilin20/p/12500388.html
Copyright © 2011-2022 走看看