– 约束: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'; -- 查看约束及对应的列名