代码改变世界

Oracle约束管理

2020-03-21 15:08  默默不语  阅读(195)  评论(0编辑  收藏  举报
--约束(检查、校验)
--创建约束的三种方式: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;