--约束(constraint)
--约束就是在数据表上强制执行的一些数据校验规则
--在执行DML操作时,数据必须符合这些规则,若不符合则无法进行操作
--约束种类(5个)
--1.非空约束 not null 简称NN 不能是NULL值
--2.唯一约束 unique 简称UK 不能重复,可以有NULL
--3.主键约束 primary key 简称PK 非空且唯一
--4.外键约束 foreign key 简称FK 要么是NULL,要么是主表关联字段内容
--5.检查约束 check 简称CK 根据条件进行约束
--1.非空约束
--建表时添加非空约束
create table my_emp(
empno number(4),
ename varchar(50) NOT NULL,
hiredate date,
salary number(6,2)
);
insert into my_emp values(null,'LLS',null,null);
--建表之后添加非空约束
delete from my_emp;
alter table my_emp modify(hiredate date not null);
--建表之后取消非空约束
alter table my_emp modify(hiredate date null);
--2.唯一约束
--创建表时添加约束
drop table my_emp;
create table my_emp(
empno number(4) constraint myemp_empno_uk unique,
ename varchar(50),
job varchar(50),
constraint myemp_ename_uk unique(ename,job)
);
insert into my_emp values(1,'LLS1','PE');
insert into my_emp values(3,'LLS2','PE');
select * from my_emp;
--创建表之后添加约束
alter table my_emp add constraint myemp_job_uk unique(job);
--创建表之后取消约束
alter table my_emp drop constraint myemp_job_uk;
--3.主键约束
--做主键的字段,应该添加主键约束
--主键的作用是唯一确定一条数据记录
--主键字段选取规则:
--主键应对系统无意义的数据,只做唯一标识用,再无其他用途
--永远不会更新主键字段
--主键应该自动生成,不要人为干预,oracle序列实现
--主键不应该包含动态编号的数据:如:时间戳
--创建表时定义约束
drop table my_emp;
create table my_emp(
-- id number constraint myemp_id_pk primary key,
id number,
empno number(4),
ename varchar(50),
sal number(6,2)
-- ,constraint myemp_empnoid_pk primary key(empno,ename)
);
create sequence myemp_seq;
insert into my_emp values(1,2,null,9999.88);
--创建表之后添加约束
alter table my_emp add constraint my_emp_id_pk primary key(id);
--创建表之后取消约束
alter table my_emp drop constraint my_emp_id_pk;
--5.检查约束
--创建表时添加约束
drop table my_emp;
create table my_emp(
id number constraint my_emp_pk primary key,
ename varchar(50) not null,
job varchar(50) constraint my_emp_job_uk unique,
sal number(6,2),
constraint my_emp_sal_ck check(sal>2000)
);
insert into my_emp values(myemp_seq.nextval,'LLS','LRS',2800);
--建表之后添加和删除约束同 unique/primary key
--5.外键约束
--外键约束条件定义在两个表的字段或一个表中两个不同字段,
--用于保证相关两个字段的关系。
--比如:emp表中的deptno列参照dept表的deptno列
--则dept称为主表(父表),emp称为从表(子表),外键约束需要加在emp的deptno字段上
--emp的deptno字段要么存放的NULL,要么是dept的deptno列的内容
--主表关联字段必须是唯一字段(unique/primary key)
--外键约束字段取值,受限于主表中某个唯一字段的取值
--先创建主表,再创建从表/先插入主表,再插入从表
create table my_dept(
deptno number(4) primary key,
dname varchar2(50),
loc varchar2(50)
);
insert into my_dept values(10,'开发部','dalian');
insert into my_dept values(20,'财务部','shenyang');
insert into my_dept values(30,'行政部','beijing');
select * from my_dept;
drop table my_emp;
create table my_emp(
empno number(4),
ename varchar2(50),
deptno number(4) constraint my_emp_deptno_fk references my_dept(deptno)
);
insert into my_emp values(1001,'LLS',10);
insert into my_emp values(1002,'LLS2',20);
insert into my_emp values(1003,'LLS3',null);
insert into my_emp values(1001,'LLS3',40);
--当主表参照列的值被从表参照时,主表的该行记录不允许被删除
delete from my_dept where deptno=10;
--也不能修改参照字段已被参照记录的值
update my_dept set deptno=40 where deptno=10;
--未参照的字段可以被删除或修改
delete from my_dept where deptno=30;
--不能直接删除主表,一般,先删除从表,再删除主表
--但是可以通过 cascade constraints 强制删除主表及关联外键约束
drop table my_dept cascade constraints;
--cascade 级联 一并 和 and
--也可以强制删除主表数据,通过在外键约束定义上添加级联删除或级联置空
--级联删除 on delete cascade
--在删除主表记录时,会关联删除从表对应的数据记录
drop table my_emp;
create table my_emp(
empno number(4),
ename varchar2(50),
deptno number(4),
constraint my_emp_deptno_fk
foreign key(deptno)
references my_dept(deptno)
on delete cascade --级联删除
);
--级联置空 on delete set null
--删除主表的内容时,会将从表中关联的数据字段置空
drop table my_emp;
create table my_emp(
empno number(4),
ename varchar2(50),
deptno number(4),
constraint my_emp_deptno_fk
foreign key(deptno)
references my_dept(deptno)
on delete set null --级联置空
);
insert into my_emp values(1001,'LLS',10);
insert into my_emp values(1002,'LLS2',20);
delete from my_dept where deptno=20;
select * from my_emp;
--约束就是在数据表上强制执行的一些数据校验规则
--在执行DML操作时,数据必须符合这些规则,若不符合则无法进行操作
--约束种类(5个)
--1.非空约束 not null 简称NN 不能是NULL值
--2.唯一约束 unique 简称UK 不能重复,可以有NULL
--3.主键约束 primary key 简称PK 非空且唯一
--4.外键约束 foreign key 简称FK 要么是NULL,要么是主表关联字段内容
--5.检查约束 check 简称CK 根据条件进行约束
--1.非空约束
--建表时添加非空约束
create table my_emp(
empno number(4),
ename varchar(50) NOT NULL,
hiredate date,
salary number(6,2)
);
insert into my_emp values(null,'LLS',null,null);
--建表之后添加非空约束
delete from my_emp;
alter table my_emp modify(hiredate date not null);
--建表之后取消非空约束
alter table my_emp modify(hiredate date null);
--2.唯一约束
--创建表时添加约束
drop table my_emp;
create table my_emp(
empno number(4) constraint myemp_empno_uk unique,
ename varchar(50),
job varchar(50),
constraint myemp_ename_uk unique(ename,job)
);
insert into my_emp values(1,'LLS1','PE');
insert into my_emp values(3,'LLS2','PE');
select * from my_emp;
--创建表之后添加约束
alter table my_emp add constraint myemp_job_uk unique(job);
--创建表之后取消约束
alter table my_emp drop constraint myemp_job_uk;
--3.主键约束
--做主键的字段,应该添加主键约束
--主键的作用是唯一确定一条数据记录
--主键字段选取规则:
--主键应对系统无意义的数据,只做唯一标识用,再无其他用途
--永远不会更新主键字段
--主键应该自动生成,不要人为干预,oracle序列实现
--主键不应该包含动态编号的数据:如:时间戳
--创建表时定义约束
drop table my_emp;
create table my_emp(
-- id number constraint myemp_id_pk primary key,
id number,
empno number(4),
ename varchar(50),
sal number(6,2)
-- ,constraint myemp_empnoid_pk primary key(empno,ename)
);
create sequence myemp_seq;
insert into my_emp values(1,2,null,9999.88);
--创建表之后添加约束
alter table my_emp add constraint my_emp_id_pk primary key(id);
--创建表之后取消约束
alter table my_emp drop constraint my_emp_id_pk;
--5.检查约束
--创建表时添加约束
drop table my_emp;
create table my_emp(
id number constraint my_emp_pk primary key,
ename varchar(50) not null,
job varchar(50) constraint my_emp_job_uk unique,
sal number(6,2),
constraint my_emp_sal_ck check(sal>2000)
);
insert into my_emp values(myemp_seq.nextval,'LLS','LRS',2800);
--建表之后添加和删除约束同 unique/primary key
--5.外键约束
--外键约束条件定义在两个表的字段或一个表中两个不同字段,
--用于保证相关两个字段的关系。
--比如:emp表中的deptno列参照dept表的deptno列
--则dept称为主表(父表),emp称为从表(子表),外键约束需要加在emp的deptno字段上
--emp的deptno字段要么存放的NULL,要么是dept的deptno列的内容
--主表关联字段必须是唯一字段(unique/primary key)
--外键约束字段取值,受限于主表中某个唯一字段的取值
--先创建主表,再创建从表/先插入主表,再插入从表
create table my_dept(
deptno number(4) primary key,
dname varchar2(50),
loc varchar2(50)
);
insert into my_dept values(10,'开发部','dalian');
insert into my_dept values(20,'财务部','shenyang');
insert into my_dept values(30,'行政部','beijing');
select * from my_dept;
drop table my_emp;
create table my_emp(
empno number(4),
ename varchar2(50),
deptno number(4) constraint my_emp_deptno_fk references my_dept(deptno)
);
insert into my_emp values(1001,'LLS',10);
insert into my_emp values(1002,'LLS2',20);
insert into my_emp values(1003,'LLS3',null);
insert into my_emp values(1001,'LLS3',40);
--当主表参照列的值被从表参照时,主表的该行记录不允许被删除
delete from my_dept where deptno=10;
--也不能修改参照字段已被参照记录的值
update my_dept set deptno=40 where deptno=10;
--未参照的字段可以被删除或修改
delete from my_dept where deptno=30;
--不能直接删除主表,一般,先删除从表,再删除主表
--但是可以通过 cascade constraints 强制删除主表及关联外键约束
drop table my_dept cascade constraints;
--cascade 级联 一并 和 and
--也可以强制删除主表数据,通过在外键约束定义上添加级联删除或级联置空
--级联删除 on delete cascade
--在删除主表记录时,会关联删除从表对应的数据记录
drop table my_emp;
create table my_emp(
empno number(4),
ename varchar2(50),
deptno number(4),
constraint my_emp_deptno_fk
foreign key(deptno)
references my_dept(deptno)
on delete cascade --级联删除
);
--级联置空 on delete set null
--删除主表的内容时,会将从表中关联的数据字段置空
drop table my_emp;
create table my_emp(
empno number(4),
ename varchar2(50),
deptno number(4),
constraint my_emp_deptno_fk
foreign key(deptno)
references my_dept(deptno)
on delete set null --级联置空
);
insert into my_emp values(1001,'LLS',10);
insert into my_emp values(1002,'LLS2',20);
delete from my_dept where deptno=20;
select * from my_emp;