• 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;
  • 相关阅读:
    Silverlight IIS设置
    HTTP Error 500.21
    ASP.NET中登录页验证码的实现 分类: ASP.NET 20120308 22:44 4936人阅读 评论(5) 收藏
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管 分类: 错误积累 20120309 09:22 6511人阅读 评论(4) 收藏
    用C求解一元二次方程的解,遇到的问题及解决办法 分类: C语言 20120313 00:26 3094人阅读 评论(0) 收藏
    推荐开发人员看的11本较具影响力书籍 分类: 转载收藏 20120311 02:03 551人阅读 评论(0) 收藏
    我的程序员之路(三) 分类: 程序人生 20120324 01:20 529人阅读 评论(0) 收藏
    我的程序员之路(二) 分类: 程序人生 20120311 00:38 848人阅读 评论(3) 收藏
    我的程序员之路(一) 分类: 程序人生 20120308 21:03 1692人阅读 评论(4) 收藏
    listBox应用
  • 原文地址:https://www.cnblogs.com/qilin20/p/12500388.html
Copyright © 2020-2023  润新知