首页 > 数据库技术 > 详细

Oracle约束管理

时间:2020-03-21 16:00:02      阅读:60      评论:0      收藏: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;

 

Oracle约束管理

原文:https://www.cnblogs.com/qilin20/p/12500388.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!