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